inline 指定符

来自cppreference.com
< cpp‎ | language

inline 指定符,在用于函数的 decl-specifier-seq 时,声明函数为一个 inline 函数

完全定义在 class/struct/union 定义内的函数,无论它是成员函数还是非成员 friend 函数,均为隐式的 inline 函数。

声明有 constexpr 的函数是隐式的 inline 函数。

被删除函数是隐式的内联函数:其(被删除的)定义可出现在多于一个翻译单元中。

(C++11 起)

inline 指定符,在用于拥有静态存储期变量(静态类变量或命名空间作用域变量)的 decl-specifier-seq 时,声明作为 inline 变量的变量。

声明为 constexpr 的静态成员变量(但不是命名空间作用域变量)是隐式的 inline 变量。

(C++17 起)

目录

[编辑] 描述

inline 函数inline 变量 (C++17 起)是拥有下列属性的函数或变量 (C++17 起)

1) inline 函数或变量 (C++17 起)在程序中可拥有多于一次定义,只要每个定义都出现在不同翻译单元中(对于非 static inline 函数和变量 (C++17 起))且所有定义等同。例如, inline 函数或 inline 变量 (C++17 起)可定义于为多个源文件所 #include 的头文件中。
2) inline 函数或变量 (C++17 起)的定义必须存在于访问它的翻译单元中(不必在访问点前)。
3) 拥有外部链接(即不声明为 static )的 inline 函数或变量 (C++17 起)拥有下列属性:
1) 它必须在每个翻译单元声明为 inline
2) 它在每个翻译单元拥有相同地址。

在 inline 函数中,

  • 所有函数定义中的函数局域 static 对象在所有翻译单元间共享(它们都引用到与定义于一个翻译单元者相同的对象)
  • 所有函数定义中定义的类型亦在所有翻译单元中相同。
  • 所有翻译单元中的字符串字面量是共享的(它们都是与定义于同一翻译单元者等同的字符串字面量)
(C++17 前)

在命名空间作用域的 inline const 变量默认拥有外部链接(不同于非 inline 非 volatile 的 const 限定变量)

(C++17 起)

inline 关键词的本意是作为指示器,以指示函数的内联替换优先于函数调用,即取代转移控制到函数体内的执行函数调用的 CPU 指令,执行函数体的副本而无需生成调用。这会避免函数调用的开销(复制参数及返回结果),但它可能导致更大的可执行文件,因为函数体必须被复制多次。

因为关键词 inline 的含义是非绑定的,编译器拥有对任何不标记为 inline 的函数使用内联替换的自由,和对任何标记为 inline 的函数生成函数调用的儿子有。这些优化选择不改变上述关于多个定义和共享 static 的规则。

因为关键词 inline 对于函数的含义已成为“容许多次定义”而不是“优先内联”,故该含义扩展到了变量。

(C++17 起)

[编辑] 注意

若拥有外部链接的 inline 函数或变量 (C++17 起)在不同翻译单元定义不同,则行为未定义。

inline 指定符不能与块作用域内(另一函数内部)的函数声明一同使用

inline 指定符不能重声明已于翻译单元定义为非 inline 的函数。

隐式生成的成员函数和任何在其首条声明声明为默认的成员函数为 inline ,正如任何其他定义在类定义内的函数。

若 inline 函数在不同翻译单元声明不同,则默认参数的积累集合必须在每个翻译单元的末尾相同。

C 中, inline 函数不必在每个翻译单元声明为 inline (至多一个可为非 inline 或 extern inline ),函数定义不必相同(但程序行为不能依赖调用的是哪个函数),且函数局域的 static 在同一函数的不同定义间不同。

关于 inline 静态成员的额外规则见静态数据成员

inline 变量消除将 C++ 打包代码为唯头文件库的障碍。

(C++17 起)

[编辑] 示例

// 头文件
#ifndef EXAMPLE_H
#define EXAMPLE_H
// 包含于多个源文件的函数必须为 inline
inline int sum(int a, int b) 
{
    return a + b;
}
#endif
 
// 源文件 #2
#include "example.h"
int a()
{
    return sum(1, 2);
}
 
// 源文件 #1
#include "example.h"
int b()
{
    return sum(3, 4);
}


[编辑] 参阅

inlineC 文档