0

extern ブロックに大きな配列がある場合、gcc が C コードをコンパイルするのに時間がかかるのはなぜですか?

#define MAXNITEMS   100000000

int buff[MAXNITEMS];
int main (int argc, char *argv[])
{
   return 0;
}
4

1 に答える 1

0

どこかにバグがあると思います。.bssセグメント内の要素に値を割り当てることはないため、コンパイラはセグメントに整数を書き込むだけなので、配列がどれほど大きくても、コンパイルに時間がかかる理由はありません。証拠:

        .file   "big.c"
        .comm   buff,4000000000000000000,32
        .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    %edi, -4(%rbp)
        movq    %rsi, -16(%rbp)
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3"
        .section        .note.GNU-stack,"",@progbits

ご覧のとおり、アセンブリ内の配列に残っているのは だけです.comm buff,4000000000000000000,32

-Sアセンブラ コードを表示するには、gcc を使用することをお勧めします。GCC のバージョンにバグがある可能性があります。GCC 4.7.3 でテストしましたが、使用する値に関係なく、ここでのコンパイル時間は同じです。

関連:静的変数はどこに保存されますか (C/C++)?

于 2013-10-03T08:56:17.130 に答える