首页 > 解决方案 > C++:编译全局数组的时间

问题描述

使用g++ 4.2.1编译,就这么简单的代码,为什么会出现这样的代码

int a[1000000000] = {0};

int main()
{
    return 0;
}

编译时间比这长

int a[10] = {0};

int main()
{
    return 0;
}

如果在 C++ 中没有在编译期间构造数组?

而且,我看到这段代码:

    int a[1000000000];

    int main()
    {
        return 0;
    }

(没有= {0})编译不需要很长时间,就像int a [10] = {0}一样快

标签: c++arrayscompilationglobal-variables

解决方案


你的证据在哪里?详细信息在哪里(例如您正在使用的编译器)?您是仅在其他内容中使用此代码还是此代码?你做了多少次运行来确定这一点?

为了得到答案:唯一可以忽略的性能差异将是解析代码 - 因为示例中会有更多符号int a[100000000] = {0};

查看生成的程序集将提供变量如何分配的答案gcc -c -S main.c

        .file   "main.c"  
        .globl  a                                                                                                                                                                                              
        .bss                                                                                                                                                                                                   
        .align 32                                                                                                                                                                                              
        .type   a, @object                                                                                                                                                                                     
        .size   a, 4000000000                                                                                                                                                                                  
a:                                                                                                                                                                                                             
        .zero   4000000000                                                                                                                                                                                     
        .text                                                                                                                                                                                                  
        .globl  main                                                                                                                                                                                           
        .type   main, @function                                                                                                                                                                                
main:                                                                                                                                                                                                          
.LFB0:                                                                                                                                                                                                         
        .cfi_startproc                                                                                                                                                                                         
        pushq   %rbp                                                                                                                                                                                           
        .cfi_def_cfa_offset 16                                                                                                                                                                                 
        .cfi_offset 6, -16                                                                                                                                                                                     
        movq    %rsp, %rbp                                                                                                                                                                                     
        .cfi_def_cfa_register 6                                                                                                                                                                                
        movl    $0, %eax                                                                                                                                                                                       
        popq    %rbp                                                                                                                                                                                           
        .cfi_def_cfa 7, 8                                                                                                                                                                                      
        ret                                                                                                                                                                                                    
        .cfi_endproc                                                                                                                                                                                           
.LFE0:                                                                                                                                                                                                         
        .size   main, .-main                                                                                                                                                                                   
        .ident  "GCC: (GNU) 7.2.1 20170915 (Red Hat 7.2.1-2)"                                                                                                                                                  
        .section        .note.GNU-stack,"",@progbits  

和:

        .file   "main.c"                                                                                                                                                                                       
        .globl  a                                                                                                                                                                                              
        .bss                                                                                                                                                                                                   
        .align 32                                                                                                                                                                                              
        .type   a, @object                                                                                                                                                                                     
        .size   a, 40                                                                                                                                                                                                
a:                                                                                                                                                                                                             
        .zero   40                                                                                                                                                                                             
        .text                                                                                                                                                                                                  
        .globl  main                                                                                                                                                                                           
        .type   main, @function                                                                                                                                                                                
main:                                                                                                                                                                                                          
.LFB0:                                                                                                                                                                                                         
        .cfi_startproc                                                                                                                                                                                         
        pushq   %rbp                                                                                                                                                                                           
        .cfi_def_cfa_offset 16                                                                                                                                                                                 
        .cfi_offset 6, -16                                                                                                                                                                                     
        movq    %rsp, %rbp                                                                                                                                                                                     
        .cfi_def_cfa_register 6                                                                                                                                                                                
        movl    $0, %eax                                                                                                                                                                                       
        popq    %rbp                                                                                                                                                                                           
        .cfi_def_cfa 7, 8                                                                                                                                                                                      
        ret                                                                                                                                                                                                    
        .cfi_endproc                                                                                                                                                                                           
.LFE0:                                                                                                                                                                                                         
        .size   main, .-main                                                                                                                                                                                   
        .ident  "GCC: (GNU) 7.2.1 20170915 (Red Hat 7.2.1-2)"                                                                                                                                                  
        .section        .note.GNU-stack,"",@progbits           

推荐阅读