Skip to content

Latest commit

 

History

History
37 lines (27 loc) · 1.8 KB

File metadata and controls

37 lines (27 loc) · 1.8 KB

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

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。