您的位置:首页 > 编程语言 > C语言/C++

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

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

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

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

关于内联函数的使用:

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

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

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

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

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

l 一旦找出了程序中那些重要的函数,以及那些内联后可以确实提高程序性能的函数,就要毫不犹豫地声明为inline。同时,要注意代码膨胀带来的问题,并监视编译器的警告信息(48),看看是否有内联函数没有被编译器内联。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: