开发者社区> 文艺小青年> 正文

Effective C++ 阅读笔记(一)透彻了解inline以及降低编译依存关系

简介:
+关注继续查看

1.类似于C中的#define

  在C++中,提供了inline函数来代替C中的宏定义。(通常可以使用const来代替单纯变量的宏定义,它可以提供类型检查。对于形似函数的宏,最好改用inline函数来替换宏定义。)

  编译器最优化机制通常被设计用来浓缩那些“不含函数调用“的代码,所以当你inline某个函数时,或许编译器就因此有能力对它执行语境相关最优化。

2.效率问题

  inline函数同#define宏定义一样,都是以函数本体做替换,这样做可能增加你的目标码(object code),从而可能造成代码膨胀(代码膨胀会导致额外的换页行为,降低指令高速缓存装置的击中率,带来效率损失)。

  如果inline函数本体很小,编译器针对“函数本体”所产生的码可能比针对“函数调用”所产生的码可能更小。

3.是申请,而不是强制,也不一定要带inline

  注意,inline只是对编译器的一个申请,不是强制命令。这项申请可以隐喻提出,也可以明确提出:

class person{
public:
    int age() const { return  m_age; } //隐喻提出inline申请
private:
    int m_age;
};

4.虚函数可以inline吗?

  大部分编译器都回拒绝太复杂的inline函数,而对所有的virtual虚函数都不能申请为inline函数,这是因为虚函数意味着”等待,直到运行期间才能确定调用哪个函数“,而inline意味着”执行前,先将调用动作替换为函数本体“。

5.构造函数和析构函数一般不应该是inline的

  通常在继承类中,即使是空的构造函数和析构函数,也会调用基类的构造函数和析构函数,如果是多重继承的话代码就会更加复杂。这样如果再把它设为inline函数的话,出现的地方都回替换函数本体,那代码量务必会增加的。

6.templates函数不一定要inline

  templates通常放在头文件中,编译器将它具现化才能知道函数本体的内容。inline需要成本,所以要多加考虑,否则可能导致代码膨胀。

7.程序升级与inline函数

  inline函数无法随程序库的升级而升级,故需要升级的函数不要采用inline函数。

  假如f是一个inline函数,这时如果把f编进程序中,一旦程序决定修改f函数,所有用到f的客户端程序都必须重新编译,这往往是不被接受的。如果是非Inline函数,一旦它有修改升级,程序只需要编译这部分重新连接就好。

 

降低文件间的编译依存关系

  C++没有把接口从实现中分离出来,为了实现接口与实现的分离,要使用声明式,不要使用定义式。基于此构想的两个手段是handle classes和interface classes。

int main()
{
    int x;
    Person p(params);
}

  当编译器看到x的定义式,它知道必须分配多少内存才能够容下一个int。但当编议器看到p的定义式,如何知道一个person有多大?唯一的办法就是询问class的定义式。然而如果class定义式不列出实现的细节,该怎么办?

int main ()
{
    int x;
    Person *p;
}

  只定义一个指向Person对象的指针。这里将不需要class的定义式,如果class Person的任何修改都不需要从新编译这个函数文件。

  也就是说,通过声明的依赖性替代定义的依赖性,来实现接口与实现的分离。

 

所以需要注意

如果使用object reference或object pointers能完成的任务,就不要使用object。references 和pointers只依靠类型声明式,但object就要依靠类型的定义式了。

  如果可以,尽量以class声明式替换class定义式。

 

不知道从何时开始,在这里记笔记已经成为了一个习惯,不记下来总觉得就忘记了

本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/archive/2013/06/07/3118363.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
windows vscode 配置cmake 编译c/c++ 基础
1. 下载基础包; 2. 配置vscode; 3. cmake 基础
69 0
【C++】使用VS2022开发可以在线远程编译部署的C++程序
c++类库源码以及其他有关资源。站点是英文的,英文不好的话可以谷歌浏览器在线翻译。http://www.cplusplus.com/
64 0
MSYS2编译C/C++程序
MSYS2编译C/C++程序
117 0
0基础都能看懂的 Visual Studio Code(VScode)使用脚本一键配置安装C/C++环境、编译运行Windows版本教程(内附脚本、安装包下载链接)
网上很多配置VScode的C、C++环境的教程,但是很多时候跟着从头到尾做了之后反而还是运行不了,于是笔者在网上翻阅资料后,发现了一个自动配置环境的脚本,亲测有效,大概5分钟就可以配置好环境了。直接进入教程。
75 0
在C语言/C++中把资源编译进exe可执行文件,并运行时释放资源
在C语言/C++中把资源编译进exe可执行文件,并运行时释放资源
106 0
C++模板总结, 外加一些模板的特殊用法(语法), 比如非类型模板参数, 模板的特化全特化, 以及真正理解为何模板不可以分离编译
C++模板总结, 外加一些模板的特殊用法(语法), 比如非类型模板参数, 模板的特化全特化, 以及真正理解为何模板不可以分离编译
30 0
C++编译错误解决办法:Class_Label[abi:cxx11]'被多次定义
C++编译错误解决办法:Class_Label[abi:cxx11]'被多次定义
24 0
解决办法:C++编译中[-Wreorder]
解决办法:C++编译中[-Wreorder]
15 0
Kalman算法C++实现代码(编译运行通过)
Kalman算法C++实现代码(编译运行通过)
51 0
【C++要笑着学】虚函数表(VBTL) | 观察虚表指针 | 运行时决议与编译时决议 | 动态绑定与静态绑定 | 静态多态与动态多态 | 单继承与多继承关系的虚表(二)
虚表是编译器的实现,而非C++的语言标准。上一章我们学习了多态的概念,本章我们深入探讨一下多态的原理。文章开头先说虚表指针,观察编译器的查表行为。首次观察我们先从监视窗口观察美化后的虚表 _vfptr,再透过内存窗口观察真实的 _vfptr。我们还会探讨为什么对象也能切片却不能实现多态的问题。对于虚表到底存在哪?我们会带着大家通过一些打印虚表的方式进行比对!铺垫完虚表的知识后,会讲解运行时决议与编译时决议,穿插动静态的知识点。文章的最后我们会探讨单继承与多继承的虚表,多继承中的虚表神奇的切片指针偏移问题,这块难度较大,后续我们会考虑专门讲解一下,顺带着把钻石虚拟继承给讲了
49 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
继承与功能组合
立即下载
对象的生命期管理
立即下载
移动与复制
立即下载