在线文档教程
C++
语言 | Language

inline specifier

内联说明符

inline说明符,当在函数%27s中使用时指示符-seq,则声明该函数为内联函数...

完全定义在类/结构/联合定义,无论它是成员函数还是非会员函数。friend函数,是隐式内嵌函数。

A function declared constexpr is implicitly an inline function. A deleted function is implicitly an inline function: its (deleted) definition can appear in more than one translation unit.(since C++11)

The inline specifier, when used in a decl-specifier-seq of a variable with static storage duration (static class member or namespace-scope variable), declares the variable to be an inline variable. A static member variable (but not a namespace-scope variable) declared constexpr is implicitly an inline variable.(since C++17)

描述

内联函数内联变量%28因为C++17%29是函数或变量%28,因为C++17%29具有以下属性:

1%29不止一个定义自C++17%29以来,程序中的内联函数或变量%28,只要每个定义出现在不同的翻译单元中,而对于非静态内联函数,则为%28,所有定义都是相同的。例如,自5月29日C++17%以来,内联函数或内联变量%28被定义在一个头文件中,即在多个源文件中包含%27D。

2%29自C++17%29以来,内联函数或变量%28的定义必须出现在转换单元中,其中不一定在接入点%29之前访问它。

3%29内嵌函数或变量%28自C++17%29外部联动%28等。未申报static%29具有下列附加属性:

1%29必须申报inline在每个翻译单位。

2%29每个翻译单位都有相同的地址。

在一个内嵌函数中,

  • 所有函数定义中的函数本地静态对象在所有转换单元%28之间共享,它们都引用在一个翻译单元%29中定义的相同对象。

  • 在所有函数定义中定义的类型在所有翻译单元中也是相同的。

String literals in all function definitions are shared (they are all the same string literal defined in just one translation unit)(until C++17)

  • 字符串文字在所有函数定义中共享%28,它们都是在一个翻译单元%29中定义的相同的字符串文字。

%28直到C++17%29

Inline const variables at namespace scope have external linkage by default (unlike the non-inline non-volatile const-qualified variables).(since C++17)

的原意inline关键字作为优化器的指示符,函数的内联替换优先于函数调用,也就是说,不执行函数调用CPU指令将控制转移到功能主体,而是执行函数体的副本而不生成调用。这避免了函数调用%28创建的开销,复制参数并检索结果%29,但它可能会导致更大的可执行文件,因为函数的代码必须重复多次。

因为关键字的这个意思inline是非绑定的,编译器可以自由地使用内联替换来替代%27s未标记为内联的任何函数,并且可以自由地生成对任何标记为内联的函数的函数调用。这些优化选择不会改变上述关于多个定义和共享静力学的规则。

Because the meaning of the keyword inline for functions came to mean "multiple definitions are permitted" rather than "inlining is preferred", that meaning was extended to variables.(since C++17)

注记

如果一个内联函数或变量%28由于C++17%29与外部链接的定义不同,则在不同的翻译单元中定义不同的行为。

内联说明符不能与另一个函数%29中块范围%28的函数声明一起使用。

内联说明符不能重新声明已在翻译单元中定义为非内联的函数。

隐式生成的成员函数和在其第一次声明中声明为默认的任何成员函数都是内联的,就像在类定义中定义的任何其他函数一样。

如果在不同的转换单元中声明内联函数,则累积的默认参数每个翻译单位的末尾必须相同。

在C中,内联函数不必在每个翻译单元%28中被声明,最多一个可以是非内联的或内联的%29,函数定义不一定是相同的%28,但是程序的行为不能取决于程序的行为被称为%29。函数-局部静力学在同一函数的不同定义之间是不同的.

See static data members for additional rules about inline static members. Inline variables eliminate the main obstacle to packaging C++ code as header-only libraries.(since C++17)

二次

// header file #ifndef EXAMPLE_H #define EXAMPLE_H // function included in multiple source files must be inline inline int sum(int a, int b) { return a + b; } #endif // source file #2 #include "example.h" int a() { return sum(1, 2 } // source file #1 #include "example.h" int b() { return sum(3, 4 }

二次

另见

c内联文件

*。

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/language/inline