inline函数背后的整体观念是,将对此函数的每一个调用都以函数本体替换。但是这样做可能增加你的目标代码大小。如果在一台内存有限的机器上,过度热衷inline会造成程序体积太大,降低指定高速缓存装置的击中率。
如果inline函数本体很小,将函数inline确实有可能导致较小的目标码和较高的指定高速缓存装置的击中率。
记住,inline只是对编译器的一个申请,不是强制命令。这项申请可以隐式声明,也可以显式声明。隐式声明的方式是将函数定义在class内:
class Person {
public:
...
int age() const { return theAge; } // inline
...
private:
int theAge;
};
这样的函数通常是成员函数,定义在类内的friend函数也被隐式声明为inline。
显式声明inline函数的做法是在其定义前添加关联字 inline
。例如标准的max函数:
template <typename T>
inline const T& std::max(const T& a, const T& b)
{ return a < b ? b : a; }
inline函数通常被定义在头文件中,因为编译器需要在编译期知道内联函数长什么样,为了将函数调用替换为被调用的本体。
大部分编译器会拒绝太过复杂(例如有循环和递归)的函数内联,而所有virtual函数的调用也都无法内联。一个表面上看起来inline的函数是否真的被内联,取决于你的编译环境和编译器。
请记住
- 将大多数内联限制在小型、被频繁效用的函数身上。这可使得之后的调试过程和二进制升级更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。
- 不要只因为function template出现在头文件,就将他们声明为inline。