inline函数调用的成本?inline和宏?
对于只有几条语句的小函数来说,与函数的调用、返回有关的准备和收尾工作的代码往往比函数体本身的代码要大的多。因此,对于这类简单的、频繁使用的小函数,将之说明为内联函数可提高运行效率。
inline函数本质上还是函数,所以可以进行类型检查,而宏只是文本替换,所以不能进行参数类型检查。
inline函数一定被置于头文件内,因为大多数建置环境(build environments)在编译过程中进行inlining,而为了将一个"函数调用"替换为"被调用的函数本体",编译器必须知道那个函数长什么样子。
大部分编译器拒绝将泰国复杂(例如带有循环或递归)的函数inlining,而所有对virtual函数的调用也都会使inlinling落空。因为virtual意味"等待,知道运行期才确定调用哪个函数",而inline意味"执行前,先将调用动作替换为被调用函数的本体"。
编译器通常不对"通过函数指针而进行的调用"实施inlining,这意味对inline函数的调用有可能被inlined,也有可能不被inlined,取决于该调用的实施方式:
inline void f() {…}
void(*pf)() = f;
f();//被inline
pf();//或许不被inline
inline函数无法随着程序库的升级而升级。换句话说,如果f是程序库内的一个inline函数,客户将"f函数本体"编进程序中,一旦程序库设计者决定改变f,所有用到f的客户端程序都必须重新编译。
将大多数inlining限制在小型、被频繁调用的函数上。这可使日后的调试过程和二进制升级更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。
不要只因为function templates出现在头文件,就将它们声明为inline。