具有内部和外部链接的内联函数与编译器优化之间有什么实际区别吗?

Is there any practical difference between an inline function having internal and external linkage, with compiler optimization?

如果函数是 static inlineinline 在这里仅作为建议。使用 staticstatic inline 函数具有内部链接,并且编译器知道不能在翻译单元之外调用此函数。因此,使用编译器优化可能不会为此函数发出任何符号。

对于带有外部链接的内联函数,C++ 标准文档 7.1.2.4 指出,

An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case. If the definition of a function appears in a translation unit before its first declaration as inline, the program is ill-formed. If a function with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required. An inline function with external linkage shall have the same address in all translation units. ...

这与 C 不同,当内联函数“具有外部链接并被引用时,外部定义必须出现在另一个翻译单元中;内联定义和外部定义是不同的,都可以用于通话 (6.7.4.8)".

另一方面,C++ 程序中的内联函数必须在每个翻译单元中都是内联的,并且具有相同的定义。当编译器看到一个 extern inline 函数时,它知道当这个函数在另一个翻译单元中被调用时,会在同一个翻译单元中提供相同的定义,因此编译器可以不带符号地“内联”它输出。

所以据我了解,在 C++ 的情况下,static inlineextern inline 之间的目标代码输出应该没有差异。这是正确的吗?

这里的重要区别是,各种翻译单元中具有内部链接的函数是不同的函数,而各种翻译单元中具有外部链接的内联函数定义都定义了相同函数。这肯定会影响生成的代码,如果仅当符号 is 发出(因为,例如,指向函数的指针被存储),外部链接使它成为弱而不是本地符号。

但是,如果在头文件中定义了“a”static inline 函数 f,则更重要的区别是 ODR 违规的可能性:任何使用f的多重定义实体(例如,头文件中的函数模板被多次包含)是无效的,因为每个定义使用不同的f.