包含 iostream 标头的奇怪行为——基于第一个符号的奇怪编译器生成的函数?

Odd behavior on including iostream header-- odd compiler generated function based on first symbol?

提问人:13steinj 提问时间:12/27/2020 最后编辑:13steinj 更新时间:12/27/2020 访问量:43

问:

在 GCC 中包含标头时,我注意到了一些奇怪的行为iostream

编辑:奇怪的行为代码,因为注释希望它很糟糕,而不是带有dissasembly的代码视图:

#include <iostream>
int main() {}

实际上,任何简单的都可以使用文件中的其他一些符号,同样会生成奇怪的汇编。 (编辑结束)。#include <iostream>

我知道它需要设置一些全局静态变量,所以我理解需要调用其中的一些函数。__static_initialization_and_destruction_0(int, int)std::ios_base

然而,这个函数本身总是被奇怪地调用——编译器根据文件中遇到的第一个符号创建一个标签/函数。如果不存在这样的符号,则使用文件名(这是我所期望的,也是 clang 总是这样做的)。

然而,即便如此,整个事情还是有点奇怪,这个助手所做的只是在调用上述函数之前设置带有常量的寄存器。在 GCC 上,在函数内部,在继续之前将常量设置寄存器与常量进行比较,在 clang 上,根本没有设置寄存器,也没有比较任何寄存器。__static_initialization...

为什么要这样做(我的意思是,设计决策,如果有人能理解一个猜测,不是导致它的文字代码,但代码也会很有趣)。

C STL G IOSTREAM Clang++

评论

2赞 1201ProgramAlarm 12/27/2020
在您的问题中包含“奇怪行为”代码,而不是作为指向外部网站的链接。
1赞 Tumbleweed53 12/27/2020
它构造了,我不明白这有什么令人困惑的?有一个全局对象,它必须被构造,函数就是发生这种情况的地方。ios_base__static_init...
0赞 13steinj 12/27/2020
@1201ProgramAlarm链接是 Matthew Godbolt 的编译器浏览器,我经常看到它在询问有关奇怪生成的汇编的问题时用来链接到它
0赞 13steinj 12/27/2020
@Tumbleweed53构造ios_base是显而易见的部分,但奇怪的是,为什么它通过另一个基于文件中第一个符号生成的标签来调用,以及为什么它设置了两个带有常量的寄存器,只是为了再次将它们与相同的常量进行比较,在 GCC 中(但不是 clang)
0赞 1201ProgramAlarm 12/27/2020
像这样的链接可以用来提供补充信息,但你问的基本部分应该包含在问题中。这样可以防止链接中断(或阅读您的问题的人无法访问),并允许其他搜索者在您的问题中找到代码。

答: 暂无答案