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定义式。

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

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

  1. Effective C++笔记_条款31将文件间的编译依存关系降至最低

    Effective C++笔记_条款31将文件间的编译依存关系降至最低 这个章节,读了两遍还是不是很清楚,有一种没法和作者沟通的感觉,看来我还是一个C++的初学者呀.好吧,不多说了,回归主题,今天的笔 ...

  2. Effective Java 阅读笔记——方法

    38:检查参数的有效性 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,在方法的开头处对参数进行检查,并且把这些限制写入文档. 注意: 对于公有方法,应该使用@throws标签在文档中说明违 ...

  3. Effective Java阅读笔记——引言

    "我很希望10年前就拥有这本书.可能有人认为我不需要任何Java方面的书籍,但是我需要这本书." --Java之父 James Gosling 在图书馆找到这本java著作时,首先 ...

  4. Effective C++阅读笔记

    1,cpp的四个特点 c, object-oriented cpp, template cpp, STL 2, 不要用 #define 使用 const, enum, inline替换define, ...

  5. More Effective C++ 阅读笔记 解释清晰

    文章目录 3.1 Item M1: 指针与引用的区别 3.2 Item M2:尽量使用C++风格的类型转换 3.3 Item M3:不要对数组使用多态 3.4 Item M4:避免无用的缺省构造函数 ...

  6. 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第二部分)...

    下面再来看书,去理解书上说的Handler classes就简单多了,我们大概过一下. 假设我们要写一个Person类,如下: 1 class Person 2 { 3 private: 4 stri ...

  7. 《Effective C++》笔记

    <Effective C++>笔记 序言 条款01:视C++为一个语言联邦 条款02:尽量以const.enum.inline替换#define 条款03:尽可能使用const 条款04: ...

  8. 《Effective C++》 笔记

    文章目录 0.导读 命名习惯 1.让自己习惯C++ 条款01 条款02:尽量以const.enum.inline替换 #define 条款03:尽可能使用const 1.const与函数声明式关联 2 ...

  9. 《Effective C++:55个提升性能的办法》阅读笔记

    一 然自己习惯C++ 1 视C++为一个语言联邦   C++语言本身的出身和目标和其名称表达的意思相近,作为C语言的超集.C++的最初的目标是在保证对C的完全兼容的前提下扩充面向对象的能力,提升研发效 ...

最新文章

  1. 致命错误: Python.h:没有那个文件或目录
  2. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...
  3. 【一周热门软件更新】我一口气发布六个版本更新,还有谁?
  4. Firefox跟博客园闹别扭!用不了博客园的HTML编辑器了。
  5. NSDictionary - 字典
  6. resamplingEnabled属性
  7. ML.NET机器学习、API容器化与Azure DevOps实践(一):简介
  8. 32位CentOS系统安装kernel-PAE支持4g以上内存
  9. php负载均衡如何获得真实ip,nginx负载均衡后端RS中获取真实ip
  10. 最新Android ADT, SDK, SDK_tool等官方下载说明(及时更新)
  11. 【元胞自动机】基于matlab激进策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型【含Matlab源码 1297期】
  12. HTML5+css3 的开心网游戏页面
  13. Flash游戏开发性能优化
  14. 应届毕业生的户口、档案、三方协议、报到证、见习期、工龄计算、转正定级等重要知识普及!
  15. uniapp 微信授权 登陆
  16. JavaSE学习笔记(十)IO流_part2
  17. 嵌入式电路中的BUCK VS LDO【转】
  18. 计算机在旅游方面的应用,浅谈旅游专业在《计算机应用基础》设计中的思考
  19. C++ windows下判断鼠标点击及获取像素点
  20. No CUDA runtime is found, using CUDA_HOME=‘/usr/local/cuda:/usr/local/cuda‘

热门文章

  1. Linux设置SFTP服务用户目录权限
  2. 从数组中间位置添加元素:unshift()方法的有一种运用
  3. FZYZ-2071 A Simple Math Problem IX
  4. laravel安装笔记
  5. 2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数
  6. 使用手机测试、访问本地环境方法
  7. ScriptManager.RegisterAsyncPostBackControl 方法
  8. XCTF_Web_新手练习区:weak_auth
  9. 双系统安装ubuntu的各种错误
  10. 禾川触摸屏编程软件_汇川PLC编程PLC代写程序