首页 > 代码库 > C++内联函数

C++内联函数

内联函数是指用inline关键字修饰的函数。在类内定义的函数被默认成内联函数。

实质

就是当需要调用一个内联函数时,不是去调用而是将该函数代码整段插入到需要使用该内联函数的地方,从而省去调用过程,提高了运行速度。

缺点

由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将会增大,消耗更多空间。

内联函数最适用于小函数使用,例如访问私有数据成员。 这些一行或两行代码的“访问器”函数的主要用途是返回有关对象的状态信息;短函数对函数调用的开销很敏感。 较长的函数在调用/返回序列方面花费的时间可成比例地减少,而从内联的获益也会减少。

 1 // when_to_use_inline_functions.cpp   2 class Point   3 {   4 public:   5     // Define "accessor" functions as   6     //  reference types.   7     unsigned& x();   8     unsigned& y();   9 private:  10     unsigned _x;  11     unsigned _y;  12 };  13   14 inline unsigned& Point::x()  15 {  16     return _x;  17 }  18 inline unsigned& Point::y()  19 {  20     return _y;  21 }  22 int main()  23 {  24 }  

假设操作坐标是此类客户端中相对常见的操作,则将两个访问器函数(前面示例中的 x 和 y)指定为“内联”通常将节省下列操作的开销:

  • 函数调用(包括参数传递和在堆栈上放置对象地址)

  • 保留调用者的堆栈帧

  • 设置新的堆栈帧

  • 返回值通信

  • 旧堆栈帧还原

  • 返回

内联函数与宏:

虽然内联函数类似于宏(因为在编译时进行调用会展开函数代码),但内联函数是通过编译器分析的,而宏是通过预处理器展开的。 因此,存在很多重大差异:

  • 内联函数遵循对正常函数强制执行的所有类型安全协议。
  • 使用与任何其他函数相同的语法来指定内联函数,只不过它们在函数声明中包含 inline 关键字。
  • 计算一次作为内联函数的参数传递的表达式。 在某些情况下,作为宏的参数传递的表达式可计算多次。

如果出现以下情况,编译器无法对函数进行内联:

  • 使用 /Ob0(调试生成的默认选项)编译函数或其调用方。

  • 函数和调用方使用不同类型的异常处理(一个中使用 C++ 异常处理,另一个中使用结构化异常处理)。

  • 函数具有变量参数列表。

  • 除非使用 /Og、/Ox、/O1 或 /O2 进行编译,否则函数使用内联程序集。

  • 函数是递归函数,不附带 #pragma inline_recursion(on)。 递归函数使用杂注内联为 16 个调用的默认深度。 若要减小内联深度,请使用 inline_depth 杂注。

  • 函数是虚函数,进行虚拟调用。 对虚函数的直接调用可以进行内联。

  • 程序采用函数地址,调用通过指向函数的指针进行。 对采用其地址的函数的直接调用可以进行内联。

  • 函数还使用 naked __declspec 修饰符进行标记。

C++内联函数