1

4GBのRAMを搭載したUbuntuで次のc++コードを実行しています

const long long  nSize = 400000000;
double Array1[nSize];
for(int i=0; i<nSize; i++)
    Array1[i]= 2*2; // store on the stack

そして、これはRAMに収まります(そして私のコンピューターは文句を言いません)。紛らわしいことに... htop は、実行時に追加の RAM がほとんど使用されていないと言っています...なぜですか?. (更新が必要な場合に備えて、通常は100秒間スリープさせます)

一方、巨大な配列を動的に割り当てると (このようなチュートリアルで推奨されているように)、htop は、RAM のほとんどを使い果たしていることを示します (すべてではなく、クラッシュする場合)。

double *pnArray2 = new double[nSize];
for(int i=0; i<nSize; i++)
    pnArray2[i] = 2*2; // store on the heap

では、なぜヒープを使用して大きなデータ構造を格納する必要があるのでしょうか... (この例のように) スタックがさらに大きな配列を処理できるのであれば?

ヒープはスタックよりも大きいはずだと思っていました! どこが間違っているのか教えてください。

4

1 に答える 1

2

おそらく、オプティマイザがその仕事をしているだけです(または、2番目のケースではそうではありません)。理論的にはポインターの範囲外でそのメモリにアクセスできるため、2番目の割り当てを最適化するのはおそらく難しいでしょう。

MSVS 2010 のリリース モードでこれを再現し、単純な

std::cout << Array1[42];

メモリ使用量を同じ値にしました。(確かに、私はより低い値を使用しました)

最初に切り取られたコードは生成されませんが、2 番目のものにはコードが生成されます。

于 2013-09-19T21:05:23.757 に答える