什么是内联函数

内联函数(inline function)是C和C++都支持的一种语言特性,简单来说,就是在编译阶段在调用内联函数的地方直接展开函数代码,避免函数调用的开销。

内联函数的优点

内联函数的主要作用是避免函数调用开销,那就必须要讨论一下函数调用有哪些开销。

一次函数调用的开销主要有

  1. 保存和恢复现场
  2. 参数传递
  3. 跳转到被调用函数,以及完成执行后返回
  4. 函数内部执行中产生的开销

内联函数的主要优点是避免上面1、2、3开销。此外因为内联函数不需要跳转到被调用函数的地址去执行,直接在当前代码段执行,提高了局部性,从而提高了CPU的缓存命中率。

内联函数的缺点

  1. 因为内联函数在被调用处展开,所以每个调用处都会有一份相同的代码段,增大了可执行文件的体积。增加的体积在加载到内存时也会占用额外的内存空间。
  2. 由于内联函数是在编译期间展开的,所以如果内联函数发生变更,那么所有调用了该函数的代码都需要重新编译
  3. 内联函数的实现必须放在头文件中,如果放在.cpp文件中,那么其他.cpp文件不能调用该函数,否则编译时会提示link error。这就导致头文件变得臃肿,偏离了头文件接口定义的角色。

什么时候使用内联函数

一般来说,当函数调用产生的开销大于函数执行的开销,或者两者相差不大时,建议使用内联函数。而当函数执行的开销远远大于函数调用的开销时,不建议使用内联函数。此外,递归也尽量不要使用内联函数,编译器通常会把递归展开一定的层数,这样生成了过多的冗余代码。不过具体情况需要具体分析,比如在嵌入式系统中,内存是非常珍贵的,那么通常就避免使用内联函数,因为会增大可执行文件的体积。

需要注意的是,inline并不是强制的,这个关键词只是给编译器的”提示”,最终是否内联是由编译器决定的。