gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:53:09 25 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

关于c++ - 具有内部和外部链接的内联函数与编译器优化之间有什么实际区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69963212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com