非常に大きな配列を作成する必要があります。50メガバイトとしましょう。
通常の静的配列として安全に作成できますか? コンパイラはそれをスタックに配置しますか (スタック オーバーフローを引き起こす可能性があります)、それともヒープに配置するのに十分スマートでしょうか?
そうする方法がない場合、プログラムの開始時に malloc または "new" で実行し、プログラムの終了時に自動的に解放する簡単な方法はありますか?
非常に大きな配列を作成する必要があります。50メガバイトとしましょう。
通常の静的配列として安全に作成できますか? コンパイラはそれをスタックに配置しますか (スタック オーバーフローを引き起こす可能性があります)、それともヒープに配置するのに十分スマートでしょうか?
そうする方法がない場合、プログラムの開始時に malloc または "new" で実行し、プログラムの終了時に自動的に解放する簡単な方法はありますか?
私が理解しているように、静的変数はスタックに存在しません。もしそうなら、彼らが住んでいるスタックフレームをポップしたとき、彼らはどこに行きますか? 静的関数変数は、呼び出し間で状態を維持する必要があるため、論理的には、静的データをヒープに保持する必要があります。
また、プログラムが終了すると、すべてが自動的に割り当て解除されます。
私の経験では、そのような大きな配列をヒープに割り当てる方が良いです (したがって、new 経由) - スタックに 2 MB を割り当てた後、UNIX システムでプログラムのコア ダンプを見たことがあります... 自動削除が必要な場合は、スマート ポインターを使用できます (boost::scoped_array など)。ただし、「プログラムの終了時に自動的に削除する」と述べているため、実際には何もする必要はありません。オペレーティングシステムは、終了時にプロセスのメモリをすべて再利用します。
とにかく、生の配列の代わりに std::vector を使用する必要があります。
これを行う簡単な方法は、 std::vector を使用することです
std::vector data;
data.reserve(<Number of Elements);
または潜在的に std::deque (使用状況によって異なります)。
コンパイラはそれをスタックに配置しますか (スタック オーバーフローを引き起こす可能性があります)、それともヒープに配置するのに十分スマートでしょうか?
スタック オーバーフローは、理論上のスタックと理論上のヒープが衝突して混ざり合うことです。スタックがオーバーフローする場合、ヒープも失敗します。
一部のシステムでは、スタックフレームの最大サイズがあります (これはコンパイラとプラットフォームに固有です) 詳細については、コンパイラのドキュメントを参照してください。結果として、通常は巨大な構造を動的に (直接ではなく) 割り当てる方が適切です。
std::vector はこれを行います (おそらく)。小さなローカル オブジェクトが存在しますが、メイン ペイロード (通常) は動的ヒープ割り当てとして実装されます。
静的に割り当てると、静的に割り当てられます。通常、実行可能ファイルには、特定の変数がサイズNのゼロで初期化されたブロックである必要があることを指定する、ある種のレコードがあります。ローダーは通常、プログラムのコードにスペースを割り当てるのと同じように、それを尊重します。そのようなもの(たとえば、アドレススペースを割り当てますが、実際にそのメモリを読み取り/書き込みしない限り、実際のメモリをバックアップすることはほとんどありません)。
50 メガバイトは、今日の標準では多すぎません。
C++ new 演算子を使用してプログラムの開始時に割り当て、最後 (または定義済みのプログラム セクションの開始/終了) で delete[] を使用して割り当てを解除できます。
この配列がロードするファイルなどを表している場合は、もちろん、ファイルがメモリにロードされるときに割り当てる方がよいでしょう。最適には、ファイルのセクションのみをメモリにマップできます (例: 1MB、2MB、または使用したい別の論理「単位」) (Windows の MapViewOfFile および UNIX システムの mmap を参照)。このようにして、仮想メモリを使い果たすことなく、非常に大きなファイルをロードできます。