内联:将此函数的每一个调用都用该函数本体替换之
过度内联,会使目标码过大;
内联一般内联小型、被频繁调用的函数,比如swap函数。
template<typename T>
inline const T& std::max(const T& a, const T& b) {
return a < b ? b : a;
}
内联函数通常一定被置于头文件内,因为大多数建制环境(build environments)在编译过程中进行inlining,为了将一个函数调用替换成被调用函数的本体,编译器至少需要知道函数长什么样子。某些建制环境可以在连接期inlining,比如基于.NET CLI的托管环境,但这是少例。Inlining在大多数C++程序中是编译期行为。
然后,函数指针一般不被内联。
inline void f() {...} //内联f
void (*pf) () = f; //pf指向f
...
f(); //将被inlining
pf(); //这个调用或许不被inlined,因为它是通过函数指针达成
构造和析构函数一般不内联。
总结:
将大多数inlining限制在小型、被频繁调用的函数身上。这可使日后的调试过程和二进制升级(binary upgradability)更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。
不要只因为function template出现在头文件,就将它们声明为inline。