スタックに ~975KB のアレイを作成しようとすると、クラッシュします。
const int size = 500;
cout << (sizeof(float)*size*size)/1024 << endl;
float myArray[size*size]; // crash
これは非常に小さなスペースのようです。変数を初期化する前に、使用可能な容量 (合計および現在) を知る方法はありますか?
スタックに ~975KB のアレイを作成しようとすると、クラッシュします。
const int size = 500;
cout << (sizeof(float)*size*size)/1024 << endl;
float myArray[size*size]; // crash
これは非常に小さなスペースのようです。変数を初期化する前に、使用可能な容量 (合計および現在) を知る方法はありますか?
スタックは、ほぼすべてのシステムで制限されています。許容されるサイズは、OS/コンパイラの組み合わせによって異なります。非常に大量のデータをスタックに置くことはお勧めできません。C++ 標準型 ( などvector
) を使用するか、独自の動的メモリ割り当てを使用してください。他の関数が追加のスタックをいつ追加するかはわかりませんが、突然、制限を超えてしまいます。スタックの最大サイズに近づかないことが最善です。
Visual C++ では、既定のスタック サイズはリンカー オプション/STACK
(doc)によって管理されます。デフォルトでは 1 MB です。
新しいスレッドごとに独自のスタックがありdwStackSize
、 function のパラメーターで初期サイズを指定できることに注意してくださいCreateThread
。0 の場合、リンカー コマンドで使用されるデフォルトになります。
他の質問については、現在/最大のスタック サイズを照会する方法はありません。問題を回避するには、重要なメモリ割り当てにヒープを使用することをお勧めします。
1MB
アンドレが言ったように、Visual Studio のデフォルトのスタック サイズは ですstd::vector
。この問題を回避するために使用するか、メモリを動的に割り当てることができます。を使用して、Visual Studio でスタック サイズを調整できます /F
。スタックにデータを割り当てるやむを得ない理由がない場合は、おそらく別のオプションを使用する方が理にかなっています。