0

Microsoft Visual C++ 2008 Express を使用していますが、かなり厄介な問題があります。XPでは発生しないようですが、Vistaでは回避する方法が見つかりません。変数を非動的に宣言するたびに、それらの合計サイズが約 30 MB を超えると、プログラムは起動時にすぐにクラッシュします。Vista が Win32 以外のアプリを 32 MB のメモリに制限していることは知っていますが、それは私の問題ではないと思います。Microsoft コンパイラを使用していますが、それが win32 コンソール アプリか win32 ウィンドウ アプリかに関係なく発生します。私はちょうど次のように宣言します...

int foo[1000][1000]

...または変数の任意の組み合わせにより、どこでも同様のサイズになり、それはさようならアプリケーションです。面白いことに、このエラーが存在するにもかかわらず、約 25% の時間で実行されます。ここで基本的なプログラミングが欠けていますか?静的割り当ては時代遅れですか? 動的割り当てを利用するには、アプリケーション全体をやり直す必要がありますか?

4

3 に答える 3

3

静的割り当ては時代遅れですか?

あなたは静的割り当てを行っていません-自動割り当てを行っており、他の人が言ったように、スタックが不足しています。

C++ でデータ用のスペースを予約するには、基本的に次の 3 つの一般的な方法があります。

  1. スタック上 - これらは「自動変数」と呼ばれ、通常の関数ローカル変数です。「int foo[][]」が main() に対してローカルであると仮定すると、これがこれです。自動データは使用可能なスタック サイズによって制限されますが、割り当ては非常に高速です (基本的にゼロ時間)。

  2. 静的 - これらは、「静的」という単語で始まる関数ローカル変数またはクラス変数であるか、関数またはクラスのスコープ外で定義された変数です。静的データはコンパイラによって予約されます。割り当て時間のオーバーヘッドはありませんが、メモリはアプリケーションの実行時間全体のために予約されます。

  3. ヒープ上 - これらは「new」または「malloc」、またはこれらの呼び出しを内部的に行う何らかのメカニズムで割り当てられます。割り当てと解放は最初の 2 つに比べて遅くなりますが、システムが提供する限り多くのメモリを持つことができ、使い終わったら返すことができます。

これら 3 つには微妙なバリエーションがあります。たとえば、alloca は 1 と 3 のハイブリッドですが、これらが基本です。

于 2008-12-04T20:10:42.243 に答える
1

設定する必要があるスタック サイズの設定があり、デフォルトで小さな値になっている場合があります。これらの設定で遊ぶ必要があったのは久しぶりです。

リンクオプションで最も可能性が高い

私は MSDEV 2005 しか動作していませんが、スタック リンカー オプションについて次のように述べています。

/STACK オプションは、スタックのサイズをバイト単位で設定します。このオプションは、.exe ファイルをビルドする場合にのみ使用します。

このオプションは、仮想メモリ内の合計スタック割り当てを指定します。デフォルトのスタック サイズは 1 MB です。リンカーは、指定された値を最も近い 4 バイトに切り上げます。

編集

独自のメモリ管理を行っていない限り、これを静的に割り当てる理由がわかりません。しかし、その場合でも、事前に動的にメモリを割り当てます...

于 2008-12-04T19:44:55.387 に答える
0

問題は、メソッド内で動的に割り当てられていない変数がスタックに割り当てられ、最大スタック サイズが使用可能なメモリの合計よりもはるかに小さいことです。はい、Windowsでは約30MBだと思います。あなたがここで行ったことは、皮肉なことに、まさにこのサイトの名前の由来です。スタック オーバーフロー。

編集: http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txtによると、ウィンドウの最大スタック サイズは 32MB です。

于 2008-12-04T19:46:12.683 に答える