内联, __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 的结尾
有关使用 内联 说明符的更多信息,请参见: