【发布时间】:2021-12-25 23:59:49
【问题描述】:
如果一个函数是static inline,这里的inline 仅作为建议起作用。对于static 或static inline,该函数具有内部链接,并且编译器知道该函数不能在翻译单元之外调用。因此,通过编译器优化,此函数可能不会发出任何符号。
对于具有外部链接的内联函数,7.1.2.4 中的 C++ 标准文档指出,
应在每个翻译单元中定义内联函数 它是 odr-used 并且在每个 案子。如果函数的定义出现在翻译单元中 在第一次声明为内联之前,该程序格式错误。如果 具有外部链接的函数在一个翻译中被声明为内联 单元,它应在其所在的所有翻译单元中声明为内联 出现;不需要诊断。带有外部的内联函数 链接在所有翻译单元中应具有相同的地址。 ...
这与 C 不同,当内联函数“具有外部链接并被引用时,外部定义必须出现在另一个翻译单元中;内联定义和外部定义是不同的,并且可以用于调用(6.7.4.8)”。
另一方面,C++ 程序中的内联函数必须在每个翻译单元中内联并且具有相同的定义。当编译器看到extern inline 函数时,它知道当在另一个翻译单元中调用该函数时,在同一个翻译单元中将提供相同的定义,因此编译器可以“内联”它而没有符号输出。
所以据我了解,在 C++ 的情况下,static inline 和 extern inline 在优化下的目标代码输出应该没有区别。这是正确的吗?
【问题讨论】:
-
C 要求在每个翻译单元中也定义函数。它与 C++ 没有什么不同。不同之处在于 C++ 将折叠重复符号留给链接器,而 C 要求您指定哪个 TU“拥有”该函数。这就是 C 看到大量使用静态内联函数的原因,因为 C 中的外部链接和内联函数有些难以正确处理。
标签: c++ language-lawyer compiler-optimization inline-functions