即使没有明确定义为内联,一个非常短的函数也可以内联吗?

Can a very short function become inlined even if it was not explicitly defined as inline?

我事先知道,在用 C 或 C++ 编写程序时,即使我将函数声明为 "inline",编译器也可以随意忽略它并决定不在每个(或任何)扩展它) 电话。

反之亦然吗?也就是说,如果编译器认为这样做会带来性能提升,那么编译器是否可以自动内联未定义为内联的非常短的函数?

另外两个子问题:此行为是否在 ANSI 标准的某处定义? C 在这方面与 C++ 不同,还是它们的行为相同?

inline 对于函数是否会被编译器内联没有约束力。这本来就是它打算做的。但从那时起,人们意识到函数是否值得内联取决于函数本身的调用位置,最好留给编译器来决定。

来自 https://en.cppreference.com/w/cpp/language/inline

Since this meaning of the keyword inline is non-binding, compilers are free to use inline substitution for any function that's not marked inline, and are free to generate function calls to any function marked inline. Those optimization choices do not change the rules regarding multiple definitions and shared statics listed above.

编辑:由于您也要求 C,来自 https://en.cppreference.com/w/c/language/inline

The intent of the inline specifier is to serve as a hint for the compiler to perform optimizations, such as function inlining, which require the definition of a function to be visible at the call site. The compilers can (and usually do) ignore presence or absence of the inline specifier for the purpose of optimization.

就标准而言,关键字 inline 与内联没有任何关系

规则(在 c++ 中)基本上是:

  • 声明inline的函数只能在一个翻译联合中定义。它仍然需要在每个使用它的翻译单元中声明。
  • 声明为 inline 的函数必须在每个翻译单元中被定义为 odr-used(ord-use 意味着调用函数或获取指针,...)。

因此,在标准的项目设置中,遵循以下两条规则几乎总是正确的。在头文件中定义的函数,总是 被声明为 inline。 *.cpp 文件中定义的函数从不声明 inline.

这就是说,我认为编译器无法真正得出关于程序员是否希望使用或不使用关键字 inline 进行内联的任何结论。关键字的名称是错误命名的不幸遗产。

can a compiler automatically inline a very short function that wasn't defined as inline if the compiler believes doing so will lead to a performance gain?

限制:
当代码使用指向函数的指针时,函数需要以非内联方式存在。

限制:
当函数在本地 .c 文件之外可见时(不是 static),这可以防止简单的内联代码。

不限:
函数的长度不是绝对限制,尽管是实际限制。

我使用过通常内联 static 函数的嵌入式处理器。 (给定的代码不使用指向它们的指针。)

inline 关键字的用处不会影响编译器内联函数的能力。

关于C和C++的关系,内联说明符在每种语言中的处理方式不同。

  • 在 C++ 中:先前未使用内部链接声明的内联函数(以及类似实体的函数和变量 (C++17 起)) 将具有 外部链接 和从其他编译单元可见。由于内联函数(通常)驻留在头文件中,这意味着同一个函数将在不同的编译单元中重复定义(这将违反 One definition ruleinline 使其合法) .在构建过程结束时(链接可执行文件或共享库时),同一实体的内联定义将合并在一起。非正式地,C++ inline 表示:"there may be multiple identical definitions of some function across multiple source files, but I want them to end up as a unique definition".
  • 在 C 中:如果未明确指定 extern,则内联函数定义对其他翻译单元不可见,不同的翻译单元可能对同一函数有不同的 inline 说明符定义姓名。此外,可能(最多)存在一个函数名称的定义,它既是 inline 又是 extern 并且这将该函数限定为外部可见的函数(即在应用地址时被选中& 运算符添加到函数名称)。来自 C 的 One 定义规则及其与 externinline 的关系与 C++ 有所不同。