为什么 gcc 13.1 在包含 <iostream> 时不生成任何代码?

How come gcc 13.1 does not generate any code when including <iostream>?

提问人:TonySalimi 提问时间:11/9/2023 更新时间:11/9/2023 访问量:101

问:

假设我有一个非常简单的程序,如下所示:

#include <iostream>

int main() 
{
    return 12;
}

使用 gcc(从 gcc-4.x 到 gcc-12.x)编译此程序时,生成的代码如下所示(在编译器资源管理器上在线查看):

main:
        push    rbp
        mov     rbp, rsp
        mov     eax, 12
        pop     rbp
        ret
__static_initialization_and_destruction_0(int, int):
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     DWORD PTR [rbp-4], edi
        mov     DWORD PTR [rbp-8], esi
        cmp     DWORD PTR [rbp-4], 1
        jne     .L5
        cmp     DWORD PTR [rbp-8], 65535
        jne     .L5
        mov     edi, OFFSET FLAT:_ZStL8__ioinit
        call    std::ios_base::Init::Init() [complete object constructor]
        mov     edx, OFFSET FLAT:__dso_handle
        mov     esi, OFFSET FLAT:_ZStL8__ioinit
        mov     edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev
        call    __cxa_atexit
.L5:
        nop
        leave
        ret
_GLOBAL__sub_I_main:
        push    rbp
        mov     rbp, rsp
        mov     esi, 65535
        mov     edi, 1
        call    __static_initialization_and_destruction_0(int, int)
        pop     rbp
        ret

这是可以接受的,因为头文件包含对象的静态变量(有关详细信息,请参阅此 Q/A)。<iostream>ios_base::Init

但是从 gcc-13.1 开始,似乎包含 header 对生成的代码没有影响。那么,问题是,gcc-13.1 是如何做到这一点的呢?是由于头文件的更改吗?还是 gcc 在 13.1 版中的优化?<iostream>iostream

C++ GCC 代码生成 iostream

评论


答: 暂无答案