Include of iostream leads to different binary
Compiling the following code int main() { return 0; } gives the assembly main: xorl %eax, %eax ret https://gcc.godbolt.org/z/oQvRDd If now iostream is included #include <iostream> int main(){ return 0; } this assembly is created. 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 Full optimization is turned on (-O3). https://gcc.godbolt.org/z/EtrEX8 Can someone explain, why including an unused header changes the binary. What is _GLOBAL__sub_I_main:? Each translation unit that includes <iostream> contains a copy of ios_base::Init object: static ios_base::Init __ioinit; This object is used to initialize the standard stre...