代码之家  ›  专栏  ›  技术社区  ›  schorsch312

包含iostream导致不同的二进制

  •  37
  • schorsch312  · 技术社区  · 6 年前

    编译以下代码

    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
    

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

    _GLOBAL__sub_I_main: ?

    2 回复  |  直到 6 年前
        1
  •  33
  •   Maxim Egorushkin    6 年前

    每个翻译单元包括 <iostream> 包含的副本 ios_base::Init 对象:

    static ios_base::Init __ioinit;
    

    此对象用于初始化标准流( std::cout 以及它的朋友们)。此方法称为 Schwarz Counter 它确保标准流总是在第一次使用之前初始化(提供 iostream

    那个功能 _GLOBAL__sub_I_main main 被称为。

        2
  •  23
  •   StoryTeller - Unslander Monica    6 年前

    包括 iostream 头具有添加静态定义的效果 std::ios_base::Init std::cout , std::cerr 等等。

    这样做的原因是为了避免静态初始化顺序的失败。它确保流对象在翻译单元之间正确初始化。