条款 30 :透彻了解inlining的里里外外
*Understand the ins and outs of inlining
关于inline 函数:
- 可以调用他们但是又不需要蒙受调用函数招致的额外开销。
- inline函数背后的整体观念是,将“对函数的每一个调用”都以函数本体替换之。这样的做法可能会导致目标代码增大,所以一般而言只对常用的短小函数声明为inline。
- inline只是对编译器的一个申请,而不是强制命令。
- inline函数通常被放在头文件内。
- 对于virtual函数申请inline是无稽之谈。因为virtual意味着等待,直到运行期才知道确定调用哪一个函数,而inline意味着,执行前先将调用动作替换为函数本体。
- 实际上继承体系内的构造和析构函数通常不该声明为inline。因为看似不含有任何代码的构造和析构可能继承了许多你不知道的东西。
- 使用inline一定要明确知道:inline函数无法随着程序库的升级而升级。
关于inline的声明形式:
一.隐式inline申请:(函数在class内被定义)
class Person{
public:
...
int age() const{return theAge;}//inline函数
...
private:
int theAge;
}
二.明确申请:例如标准库的max实现如下
template<typename T>
inline const T& std::max(const T& a,const T& b){//inline函数
retrun a<b?b:a;
}
请记住
- 将大多数inlining限制在小型,被频繁调用的函数身上。这可以使日后的调试过程和二进制升级更容易,也可以时潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。
- 不要只因为function templates出现在头文件,就将他声明为inline。