inline、__inline、__forceinline

inline和 __inline 标识符指示编译器在调用函数的每个位置插入函数体的副本。

inline function_declarator;   
__inline function_declarator;   // Microsoft Specific
__forceinline function_declarator;   // Microsoft Specific

备注

仅当编译器的成本/效益分析显示它是有益的时候,引发插入(称为内联展开或内联)。 内联展开缓和较大代码尺寸的潜在成本的函数调用开销。

__forceinline 关键字重写成本/效益分析而是依赖程序员的判断。 在使用 __forceinline时,小心执行。 __forceinline 的不可区分的使用会导致仅有临界性能提高的较大代码,或在某些情况下,导致性能损失(例如由于增加的较大可执行文件的分页)。

使用内联函数可以使程序更快速,因为它们消除开销与函数调用。 内联展开函数受不适用于普通函数的代码优化的限制。

编译器将内联展开选项和关键字视为建议。 不保证函数会内联。 即使有 __forceinline 关键字也无法强制编译器内联特定函数。 在使用 /clr 编译时,如果有应用于该函数的安全特性,则该编译器将不内联函数。

内联 关键字仅在 C++ 中可用。 __inline 和 __forceinline 关键字可在 C 和 C++ 中可用。 对于与以前版本的兼容,_inline 是 __inline 的同义词。

内联 关键字告知首选内联展开的编译器。 但是,该编译器可以创建函数的单独实例(请实例化)和创建标准调用链接,而不是插入内联代码。 可能发生的两个情况:

  • 递归函数

  • 通过翻译单元中其他地方的一个指针引用的函数。

这些原因可能在编译器判断时影响内联(“其他可能也会这样”);您不应依赖“内联”来调用已内联的函数。

与常规函数一样,内联函数中的参数的求值的顺序没有定义。 实际上,当用常规函数调用协议传递时,与计算参数的顺序不同。

/Ob 编译器优化选项有助于确定内联函数展开是否确实发生。

无论其是否在源代码中被请求,/LTCG 执行跨模块内联。

示例 1

// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
   if( a > b ) 
      return a;
   return b;
}

可以通过使用“内联”关键字或通过在类定义中放置函数来内联声明类的成员函数。

示例 2

// inline_keyword2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;

class MyClass {
public:
   void print() { cout << i << ' '; }   // Implicitly inline
private:
   int i;
};

Microsoft 专用

__inline 关键字等效于“内联”。

即使与 __forceinline,该编译器无法在所有情况下直接插入代码。 该编译器无法内联函数,若:

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

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

  • 任何函数都不包括变量参数列单。

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

  • 该函数为递归,和不带有 #pragma inline_recursion(on)。 使用杂注,递归函数内联到具有 16 个调用的默认深度。 若要减少内联深度,请使用 inline_depth 杂注。

  • 该函数是虚拟的且虚调用。 对于虚函数的直接调用可以内联。

  • 该程序采用函数的地址,而调用是由指向函数的指针生成。 对其地址所采用的函数的直接调用可能内联。

  • naked __declspec 修饰符标记函数。

如果编译器无法内联用 __forceinline 声明的函数,会生成 1 级警告。

递归函数可以被内联替换到 inline_depth 杂注指定的深度,最多 16 次调用。 该深度后,递归函数调用被视为对函数实例的调用。由内联试探法检查的递归函数深度不能超过16. inline_recursion 杂注在展开下控制当前函数的内联展开。 若要了解相关信息,请参见 Inline-Function Expansion (/Ob) 编译器选项。

结束 Microsoft 专用

有关使用“内联”说明符,请参见:

请参见

参考

C++ 关键字

noinline

auto_inline