gpt4 book ai didi

c++ - 为什么 C++ 编译器合成函数(例如默认构造函数)是内联的?

转载 作者:太空狗 更新时间:2023-10-29 20:04:29 25 4
gpt4 key购买 nike

我知道 C++ 中的编译器合成函数,例如默认构造函数、复制构造函数等是隐式内联的,但我只是好奇为什么

而且,如果这些函数需要执行的任务太复杂而不适合内联怎么办?

最佳答案

第一个问题是 inline 的真正含义是什么? ?该问题的答案与实际内联关系不大,而与单一定义规则关系更大。当编译器为内联函数生成代码时,它会标记符号,以便链接器知道在不同的翻译单元中使用相同的符号是可以的。

考虑到这一点,答案就很简单了。如果函数不是 inline并且编译器在两个不同的翻译单元中生成它们,将两个翻译单元链接在一起会导致违反程序员无法修复的单一定义规则。


关于当函数没有真正内联时会发生什么,上面的答案似乎不够清楚。从第一段开始:

When the compiler generates code for an inline function it marks the symbol for the linker to know that having that same symbol in different translation units is fine.

编译器确实会在每个使用该函数的翻译单元中生成一个函数符号。然后链接器将使用标记(弱符号)从程序中丢弃除一个定义之外的所有定义。在许多情况下,编译器会生成 inline 的外联定义即使函数代码实际上是内联的,也能发挥作用。

这不同于将函数标记为 static (内部链接)就好像它被标记为内部链接一样,所有这些定义都将保留在最终的可执行文件中 *

* 有一些链接器能够识别出不同的符号完全相同并会删除重复项,因此它可能会合并 void f() { std::cout << "Hi\n"; } with void g() { std::cout << "Hi\n"; . Linkers that do this can also fold all of the static` 一起运行,但这是标准要求之外的优化。

关于c++ - 为什么 C++ 编译器合成函数(例如默认构造函数)是内联的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672904/

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