extern ブロックに大きな配列がある場合、gcc が C コードをコンパイルするのに時間がかかるのはなぜですか?
#define MAXNITEMS 100000000
int buff[MAXNITEMS];
int main (int argc, char *argv[])
{
return 0;
}
extern ブロックに大きな配列がある場合、gcc が C コードをコンパイルするのに時間がかかるのはなぜですか?
#define MAXNITEMS 100000000
int buff[MAXNITEMS];
int main (int argc, char *argv[])
{
return 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 でテストしましたが、使用する値に関係なく、ここでのコンパイル時間は同じです。