gpt4 book ai didi

c++ - 包含 iostream 会导致不同的二进制文件

转载 作者:IT老高 更新时间:2023-10-28 12:32:09 33 4
gpt4 key购买 nike

编译如下代码

int main() {
return 0;
}

给出程序集

main:
xorl %eax, %eax
ret

https://gcc.godbolt.org/z/oQvRDd

如果现在包含 iostream

#include <iostream>   
int main() {
return 0;
}

此程序集已创建。

main:
xorl %eax, %eax
ret
_GLOBAL__sub_I_main:
subq $8, %rsp
movl $_ZStL8__ioinit, %edi
call std::ios_base::Init::Init() [complete object constructor]
movl $__dso_handle, %edx
movl $_ZStL8__ioinit, %esi
movl $_ZNSt8ios_base4InitD1Ev, %edi
addq $8, %rsp
jmp __cxa_atexit

完全优化已开启 (-O3)。 https://gcc.godbolt.org/z/EtrEX8

谁能解释一下,为什么包含未使用的 header 会更改二进制文件。 _GLOBAL__sub_I_main: 是什么?

最佳答案

包含 <iostream> 的每个翻译单元包含 ios_base::Init 的拷贝对象:

static ios_base::Init __ioinit;

此对象用于初始化标准流(std::cout 及其 friend )。此方法称为 Schwarz Counter它确保标准流在第一次使用之前总是被初始化(假设 iostream header 已包含在内)。

那个函数_GLOBAL__sub_I_main是编译器为每个翻译单元生成的代码,它调用该翻译单元中全局对象的构造函数,并且还安排在退出时调用相应的析构函数调用。此代码由 main 之前的 C++ 标准库启动代码调用。被调用。

关于c++ - 包含 iostream 会导致不同的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52079248/

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