C ++: время для компиляции глобального массива - PullRequest
0 голосов
/ 07 июня 2018

Используя 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}

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Где ваши доказательства?Где детали (например, компилятор, который вы используете)?Вы используете только этот код или этот код внутри чего-то еще?Сколько прогонов вы сделали, чтобы определить это?

Чтобы получить ответ: единственная незначительная разница в производительности будет заключаться в разборе кода - поскольку в примере 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  

AND:

        .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           
0 голосов
/ 07 июня 2018

Оператор:

int a[100000000] = {0};

должен занять больше времени для компиляции, чем

int a[10] = {0};

, потому что есть больше символов для анализа.

Однако время компиляции должнобыть незначительным.

Может потребоваться больше времени, если компилятор создает сегмент данных со всеми этими 0 вместо использования цикла инициализации.

Оператор:

int b[100000000];

будет компилироваться быстрее, чем предыдущие операторы, поскольку компилятору не нужно выдавать код или данные для инициализации массива.

...