effective C++笔记之条款33: 明智地使用内联

原创 2012年03月21日 19:29:21

 

l        内联函数的基本思想在于将每个函数调用以它的代码体来代替。这种做法很可能会增加整个目标代码的体积。在一台内存有限的计算机里,过份地使用内联所产生的程序会因为有太大的体积而导致可用空间不够。过多的使用内联还会降低指令高速缓存的命中率,从而使取指令的速度降低,因为从主存取指令当然比从缓存要慢。

l        另一方面,如果内联函数非常短,编译器为这个函数体生成的代码就会真的比为函数调用生成的代码要小很多。内联这个函数将会确实带来更小的目标代码和更高的缓存命中率。

l        一个给定的内联函数是否真的被内联取决于编译器的具体实现。假设某个函数f并声明为inline,但是编译器决定不对它内联。则无论是新规则还是旧规则,如果内联函数没有被内联,每个调用内联函数的地方还得承担函数调用的开销;并且将该函数视为static,这样就消除了链接时的错误;如果是旧规则,还得承受代码体积的增加,因为每个包含内联函数的编译单元都有一份内联函数的代码及其静态变量的代码;新规则下则只有一个内联函数的外部拷贝。

关于内联函数的使用:

l        构造函数和析构函数常常不适合内联。

l        如果f是一个内联函数,修改它后,所有使用f的用户程序必须重新编译。相反,如果f不是内联函数,对f的修改仅需要用户重新链接,这就比需要重新编译大大减轻了负担;如果包含这个函数的程序库是动态链接的,程序库的修改对用户来说是完全透明的。

l        内联函数中的静态对象常常表现出违反直觉的行为。所以,如果函数中包含静态对象,通常要避免将它声明为内联函数。M26.

l        大多数调试器遇上内联函数都会无能为力。无法设置断点,无法单步调试。可以作为是否内联的决策根据之一。

l        一般来说,实际编程时最初的原则是不要内联任何函数,除非函数确实很小很简单。

l        一旦找出了程序中那些重要的函数,以及那些内联后可以确实提高程序性能的函数,就要毫不犹豫地声明为inline。同时,要注意代码膨胀带来的问题,并监视编译器的警告信息(48),看看是否有内联函数没有被编译器内联。

相关文章推荐

effective C++笔记之条款41、42: 区分继承和模板、明智地使用私有继承

条款41:区分继承和模板 l        模板类的特点:行为不依赖于类型 l        当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。(堆栈类型) 因为堆栈类型中,即使...
  • lifu119
  • lifu119
  • 2012年04月02日 17:16
  • 7243

effective C++笔记之条款43: 明智地使用多继承(MI)

l        多继承带来了单继承中绝对不会存在的复杂性。最基本的一条是二义性。如果一个派生类从多个基类继承了一个成员名,所有对这个名字的访问都是二义的;你必须明确地说出你所指的是哪个成员。如下所示...
  • lifu119
  • lifu119
  • 2012年04月04日 15:21
  • 1694

条款40、明智地使用多重继承

现在考虑多重继承MI(multiple inheritance)。程序可能从一个以上的基类继承相同的名称(如函数 typedef等)。那会导致较多歧义。考虑以下代码: class A { ...

《Effective C++》:条款40:明智而审慎的使用多重继承

多重继承(multiple inheritance:MI)虽然使用不多,也不建议被使用,但是在真正需要使用的时候,也不要犹豫。...

【Effection C++】读书笔记 条款40:明智而审慎的使用多重继承

【Effection C++】继承与面向对象设计 条款40:明智而审慎的使用多重继承

Effective Modern C++ 条款33 对需要std::forward的auto&&参数使用decltype

Effective Modern C++ 条款33

C++ 明智地使用多继承

要看是谁来说,多继承(MI)要么被认为是神来之笔,要么被当成是魔鬼的造物。支持者宣扬说,它是对真实世界问题进行自然模型化所必需的;而批评者争论说,它太慢,难以实现,功能却不比单继承强大。更让人为难的是...

《Effective C++》读书笔记之item40:明智而审慎地使用多重继承

1.多重继承的缺点: (1)从一个以上的基类继承相同名称,可能导致歧义,使用时应当使用域作用符限定具体是哪个基类的成员。注意:在这种歧义中,C++用来解析重载函数调用的规则在起作用——在看到是否有个...

【Effective C++读书笔记】篇十三(条款31~条款33)

条款31:将文件间的编译依存关系降至最低                                                                         请记住...

【让你的C++程序更加高效】条款01:尽量使用常量/内联而不是预处理器/宏定义

C++程序员分为两种,一种读过《让你的C++程序更加高效》,另一种则没有 Item  1:  Prefer const  and inline to #define. OR "prefer...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:effective C++笔记之条款33: 明智地使用内联
举报原因:
原因补充:

(最多只允许输入30个字)