effective C++笔记之条款33: 明智地使用内联
2012-03-21 19:29
218 查看
l 内联函数的基本思想在于将每个函数调用以它的代码体来代替。这种做法很可能会增加整个目标代码的体积。在一台内存有限的计算机里,过份地使用内联所产生的程序会因为有太大的体积而导致可用空间不够。过多的使用内联还会降低指令高速缓存的命中率,从而使取指令的速度降低,因为从主存取指令当然比从缓存要慢。
l 另一方面,如果内联函数非常短,编译器为这个函数体生成的代码就会真的比为函数调用生成的代码要小很多。内联这个函数将会确实带来更小的目标代码和更高的缓存命中率。
l 一个给定的内联函数是否真的被内联取决于编译器的具体实现。假设某个函数f并声明为inline,但是编译器决定不对它内联。则无论是新规则还是旧规则,如果内联函数没有被内联,每个调用内联函数的地方还得承担函数调用的开销;并且将该函数视为static,这样就消除了链接时的错误;如果是旧规则,还得承受代码体积的增加,因为每个包含内联函数的编译单元都有一份内联函数的代码及其静态变量的代码;新规则下则只有一个内联函数的外部拷贝。
关于内联函数的使用:
l 构造函数和析构函数常常不适合内联。
l 如果f是一个内联函数,修改它后,所有使用f的用户程序必须重新编译。相反,如果f不是内联函数,对f的修改仅需要用户重新链接,这就比需要重新编译大大减轻了负担;如果包含这个函数的程序库是动态链接的,程序库的修改对用户来说是完全透明的。
l 内联函数中的静态对象常常表现出违反直觉的行为。所以,如果函数中包含静态对象,通常要避免将它声明为内联函数。M26.
l 大多数调试器遇上内联函数都会无能为力。无法设置断点,无法单步调试。可以作为是否内联的决策根据之一。
l 一般来说,实际编程时最初的原则是不要内联任何函数,除非函数确实很小很简单。
l 一旦找出了程序中那些重要的函数,以及那些内联后可以确实提高程序性能的函数,就要毫不犹豫地声明为inline。同时,要注意代码膨胀带来的问题,并监视编译器的警告信息(48),看看是否有内联函数没有被编译器内联。
l 另一方面,如果内联函数非常短,编译器为这个函数体生成的代码就会真的比为函数调用生成的代码要小很多。内联这个函数将会确实带来更小的目标代码和更高的缓存命中率。
l 一个给定的内联函数是否真的被内联取决于编译器的具体实现。假设某个函数f并声明为inline,但是编译器决定不对它内联。则无论是新规则还是旧规则,如果内联函数没有被内联,每个调用内联函数的地方还得承担函数调用的开销;并且将该函数视为static,这样就消除了链接时的错误;如果是旧规则,还得承受代码体积的增加,因为每个包含内联函数的编译单元都有一份内联函数的代码及其静态变量的代码;新规则下则只有一个内联函数的外部拷贝。
关于内联函数的使用:
l 构造函数和析构函数常常不适合内联。
l 如果f是一个内联函数,修改它后,所有使用f的用户程序必须重新编译。相反,如果f不是内联函数,对f的修改仅需要用户重新链接,这就比需要重新编译大大减轻了负担;如果包含这个函数的程序库是动态链接的,程序库的修改对用户来说是完全透明的。
l 内联函数中的静态对象常常表现出违反直觉的行为。所以,如果函数中包含静态对象,通常要避免将它声明为内联函数。M26.
l 大多数调试器遇上内联函数都会无能为力。无法设置断点,无法单步调试。可以作为是否内联的决策根据之一。
l 一般来说,实际编程时最初的原则是不要内联任何函数,除非函数确实很小很简单。
l 一旦找出了程序中那些重要的函数,以及那些内联后可以确实提高程序性能的函数,就要毫不犹豫地声明为inline。同时,要注意代码膨胀带来的问题,并监视编译器的警告信息(48),看看是否有内联函数没有被编译器内联。
相关文章推荐
- effective C++笔记之条款41、42: 区分继承和模板、明智地使用私有继承
- [Effective C++笔记]条款39:明智而审慎地使用private继承
- effective C++笔记之条款43: 明智地使用多继承(MI)
- 读书笔记_Effective_C++_条款四十:明智而审慎地使用多重继承
- Effective C++ 条款33: 明智地使用内联
- effective C++笔记之条款12: 尽量使用初始化而不要在构造函数里赋值
- Effective c++ 学习笔记——条款04:确定对象被使用前已先被初始化
- Effective C++ -----条款40:明智而审慎地使用多重继承
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
- Item 40:明智地使用多继承 Effective C++笔记
- effective C++笔记之条款27:如果不想使用隐式生成的函数就要显示地禁止它
- Effective C++笔记_条款33确定你的public继承塑模出is-a关系
- effective C++笔记之条款20、21:避免public接口出现数据成员、尽可能使用const
- Item 39:明智地使用private继承 Effective C++笔记
- Effective STL学习笔记-条款33
- 读书笔记_Effective_C++_条款三十九:明智而审慎地使用private继承
- effective C++笔记之条款47: 确保非局部静态对象在使用前被初始化
- 条款33: 明智地使用内联
- Effective C++ -----条款39:明智而审慎地使用private继承
- Effective Modern C++ 条款33 对需要std::forward的auto&&参数使用decltype