【问题标题】:C++: Time to compile a global arrayC++:编译全局数组的时间
【发布时间】:2018-06-07 17:18:19
【问题描述】:

使用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}

【问题讨论】:

  • 你认为a分配在哪里?你认为它是什么时候创建的?你认为它对可执行文件大小有影响吗?你测试过这个吗?提示:您正在声明一个非常大的静态分配变量。这与您动态分配的int a* 大不相同。
  • @tadman 我刚刚编辑了这个问题,检查即使有一个大数组,没有 ={0} 编译速度也很快
  • 没有= {0}; 你的编译器可能会优化它,因为它没有被使用......
  • 没有={0} 不需要初始化代码。取决于编译器如何初始化该数组,例如它是否在可执行文件中创建了一个 1000000000 数组并花费了合理的时间来编写这个庞大的文件?
  • 我在 clang++ 3.4-1(Linux,X64,使用 -O0 标志)上观察到了很大的时间差异:编译第一个版本的程序需要 0.1 秒(生成一个 7KB 的可执行文件)和 3 秒(生成一个 9KB 的可执行文件)在我的机器上编译第二个。

标签: c++ arrays compilation global-variables


【解决方案1】:

声明:

int a[100000000] = {0};

应该比编译时间更长

int a[10] = {0};

因为要解析的字符更多。

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

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

声明:

int b[100000000];

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

【讨论】:

  • 那些0不是在执行期间分配的吗?
  • 必须将那些 0 放入数组中。两种常见的方法是将它们放入可执行文件的数据段(以便在 RTL 初始化期间复制它们),或者可以通过代码生成它们。取决于编译器。但是,编译器会花费一些时间来发出代码或数据。
【解决方案2】:

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

要获得答案:唯一可以忽略的性能差异将是解析代码 - 因为在 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           

【讨论】:

  • 他是对的。确实需要很长时间(x64 GCC 6.3,-std=c++11 -O2),而发出的代码没有变化。这是有道理的,因为a 是全球性的并且无论哪种方式都归零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2012-08-19
  • 2022-01-12
  • 2010-10-06
  • 1970-01-01
  • 2015-12-21
相关资源
最近更新 更多