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

C++:编译全局数组的时间

  •  -3
  • Mucida  · 技术社区  · 6 年前

    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}一样快

    2 回复  |  直到 6 年前
        1
  •  0
  •   Thomas Matthews    6 年前

    声明:

    int a[100000000] = {0};
    

    int a[10] = {0};
    

    因为有更多的字符需要解析。

    但是,编译时间应该可以忽略不计。

    如果编译器使用所有这些0创建数据段而不是使用初始化循环,则可能需要更多的时间。

    int b[100000000];
    

    将比前面的语句更快地编译,因为编译器不必发出代码或数据来初始化数组。

        2
  •  0
  •   Mindaugas Bernatavičius    6 年前

    你的证据呢?细节在哪里(比如你正在使用的编译器)?你是在使用这个代码还是在其他代码中使用这个代码?你做了多少次测试来确定这个?

    为了得到答案:唯一可以忽略的性能差异将是在解析代码时-因为在代码中会有更多的符号 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