9

3 つの配列宣言を持つ C++ コードがあります。

float A[NUM]; float B[NUM]; float C[NUM];

でコンパイルするとNUM=512、コンパイルが高速です

time g++ -DNUM=512 trials trials.cpp -lm

0.16s user 0.04s system 94% cpu 0.219 total

ただし、 でコンパイルするとNUM=167772160、さらに時間がかかります。

time g++ -DNUM=167772160 trials trials.cpp -lm

7.90s user 0.69s system 99% cpu 8.604 total

私は何年も C++ を使っていません。コンパイル後のオブジェクトファイルのサイズは同じなのに、コンパイルに時間差があるのはなぜか知りたいです。

4

2 に答える 2

10

これは非常によく知られている難問です。途中のどこかで、アレイの実際のメモリが割り当てられます

参照: スワップスペースに関連するリンカーのパフォーマンス?

ご想像のとおり、ldは実際にこの配列の静的メモリ空間全体(またはプログラム全体)を匿名でmmapしようとしているように見えます。プログラムの残りの部分は非常に小さいため、わかりにくいです。それはすべてその余分な4096に収まるかもしれません)。

関連する:

于 2012-04-05T21:40:05.727 に答える
0

配列はローカルまたはグローバルに宣言されていますか? グローバルの場合、リンカは .data セクションにメモリを割り当てる必要があるため、時間がかかる場合があります。ただし、ローカルで宣言すると、メモリはリンク時ではなく実行時に割り当てられるためです。リンカの問題になりますが、コンパイラのアナライザやオプティマイザに起因する問題です。

于 2012-04-07T01:29:25.130 に答える