2

スタックに ~975KB のアレイを作成しようとすると、クラッシュします。

const int size = 500;
cout << (sizeof(float)*size*size)/1024 << endl;
float myArray[size*size]; // crash

これは非常に小さなスペースのようです。変数を初期化する前に、使用可能な容量 (合計および現在) を知る方法はありますか?

4

3 に答える 3

6

スタックは、ほぼすべてのシステムで制限されています。許容されるサイズは、OS/コンパイラの組み合わせによって異なります。非常に大量のデータをスタックに置くことはお勧めできません。C++ 標準型 ( などvector) を使用するか、独自の動的メモリ割り当てを使用してください。他の関数が追加のスタックをいつ追加するかはわかりませんが、突然、制限を超えてしまいます。スタックの最大サイズに近づかないことが最善です。

于 2013-07-25T13:23:25.333 に答える
3

Visual C++ では、既定のスタック サイズはリンカー オプション/STACK (doc)によって管理されます。デフォルトでは 1 MB です。

新しいスレッドごとに独自のスタックがありdwStackSize、 function のパラメーターで初期サイズを指定できることに注意してくださいCreateThread。0 の場合、リンカー コマンドで使用されるデフォルトになります。

他の質問については、現在/最大のスタック サイズを照会する方法はありません。問題を回避するには、重要なメモリ割り当てにヒープを使用することをお勧めします。

于 2013-07-25T13:21:59.873 に答える
3

1MBアンドレが言ったように、Visual Studio のデフォルトのスタック サイズは ですstd::vector。この問題を回避するために使用するか、メモリを動的に割り当てることができます。を使用して、Visual Studio でスタック サイズを調整できます /F。スタックにデータを割り当てるやむを得ない理由がない場合は、おそらく別のオプションを使用する方が理にかなっています。

于 2013-07-25T13:22:18.623 に答える