内联, __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 ()。 请注意,递归函数内联深度为默认值 16 的调用。 若要减少内联深度,请使用 inline_depth 说明。

  • 该函数是虚拟的和实际上调用。 直接调用虚函数可以内联。

  • 过程采用函数的地址,然后调用传递给函数的指针调用。 直接调用具有对其所采用的地址可能内联的函数。

  • 函数也标记为  __declspec 修饰符。

如果编译器无法内联函数。 __forceinline,会生成一个 1 级警告。

递归函数可以替换内联到 inline_depth 说明指定的深度,最多 16 调用。 之后深度,递归函数调用将调用的函数实例。 递归函数。内联试探法检查的深度不能超过 16。 inline_recursion 说明当前控件功能的内联展开在展开下。 为相关信息参见 内联函数展开 (/Ob) 编译器选项。

特定于 Microsoft 的结尾

有关使用 内联 说明符的更多信息,请参见:

请参见

参考

C++关键字

noinline

auto_inline