条款30:透彻了解inline的里里外外

来源:互联网 发布:sql数据类型转换 编辑:程序博客网 时间:2024/04/30 17:12

结论1:将大多数inline限制在小型、被频繁调用的函数身上。这可使日后的调试过程和二进制升级更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。

inline函数背后的整体观念是,将”对此函数的每一个调用“都以函数本体替换之。这样做会增加目标码的大小,造成的代码膨胀亦会导致额外的换页行为,降低指令高速缓存装置的击中率,以及伴随这些而来的效率损失。

inline只是对编译器的一个申请,不是强制命令。这项申请可以隐喻提出,也可以明确提出。隐喻方式是将函数定义于class定义式内,这样的函数通常是成员函数或friend函数;明确声明inline函数的做法则是在其定义式前加上关键字inline。大部分编译器拒绝将太过复杂的函数inlining,而所有对virtual函数的调用也都会使inlining落空,inlining在大多数C++程序中是编译期行为。一个表面上看似inline的函数是否真是inline,取决于建置环境,主要取决于编译器。

inline函数无法随着程序库的升级而升级。换句话说如果f是程序库内的一个inline函数,客户将”f函数本体“编进其程序中,一旦程序库设计者决定改变f,所有用到f的客户端程序都必须重新编译。

大部分调试器面对inline函数都束手无策。

inline函数的调用有可能被inlined,也可能不被inlined,取决于该调用的实施方式,编译器通常不对”通过函数指针而进行的调用"实施inline。

结论2:不要只因为function template出现在头文件,就将它们声明为inline。

在决定哪些函数该被声明为inline而哪些函数不该时,掌握一个合乎逻辑的策略:一开始先不要将任何函数声明为inline,或至少将inline施行范围局限在那些"一定成为inline"或“十分平淡无奇”的函数身上。

0 0
原创粉丝点击