【问题标题】:Is there any practical difference between an inline function having internal and external linkage, with compiler optimization?具有内部和外部链接的内联函数与编译器优化之间有什么实际区别吗?
【发布时间】:2021-12-25 23:59:49
【问题描述】:

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

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

应在每个翻译单元中定义内联函数 它是 odr-used 并且在每个 案子。如果函数的定义出现在翻译单元中 在第一次声明为内联之前,该程序格式错误。如果 具有外部链接的函数在一个翻译中被声明为内联 单元,它应在其所在的所有翻译单元中声明为内联 出现;不需要诊断。带有外部的内联函数 链接在所有翻译单元中应具有相同的地址。 ...

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

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

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

【问题讨论】:

  • C 要求在每个翻译单元中也定义函数。它与 C++ 没有什么不同。不同之处在于 C++ 将折叠重复符号留给链接器,而 C 要求您指定哪个 TU“拥有”该函数。这就是 C 看到大量使用静态内联函数的原因,因为 C 中的外部链接和内联函数有些难以正确处理。

标签: c++ language-lawyer compiler-optimization inline-functions


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 2020-06-17
    • 2016-12-01
    • 2011-01-24
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多