编译以下代码
int main() {
return 0;
}
给予组装。main:
xorl %eax, %eax
ret
如果现在包含了iostream
https://gcc.godbolt.org/z/oQvRDd
#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
有人可以解释一下,为什么包含一个未使用的头文件会改变二进制文件。 _GLOBAL__sub_I_main:
是什么?
cout
的任何调用实例,因为它证明了这些分支从未被执行; 你仍然会留下那些无用的残留物。如果你使用了printf
,那么它将被完全消除。 - Matthieu M.