2

8MB のスタックで作業する必要があり、標準の C++ 配列を使用したいとします。
本当ですか、それは

const int MX = 10000;
int DP[MX][MX];

int main() {
  printf("%likB\n", (sizeof(DP))>>10);
}

はヒープ メモリを使用し、そのため segfault しません (DPで宣言されている場合とは対照的にmain)? new/mallocを介してメモリを割り当てることとは異なりますかmain(問題以外にfree)?

4

4 に答える 4

5

最新の OS では、実行可能ファイルが使用するメモリは (通常) 5 つの異なるセクションに分割されます。

  • コード セクション (ヒステリックなtext歴史的な理由から、Linux/Unix システムではコード セクションとも呼ばれます)。これは、関数が「生きている」場所です。多くの場合、「Hello, World!」などの定数値にも使用されます。部分は CODE セクションに格納されます。char *s = "Hello, World";

  • 「初期化された」データ セクション (「データ」とも呼ばれる) - 値が与えられたグローバル (C および C++ の用語では静的) データ用。int x = 42;

  • 初期化されていないデータ (BSS、ブロック ストレージ セクションとも呼ばれます) - 値が指定されていないため、ゼロに初期化されるグローバル データ用。int y;グローバルなコンテキストで、またはstatic int status;このセクションに分類されます。

上記のセクションはすべて、実行可能ファイルで定義されています。一部の実行可能ファイルにはこれよりも多くのセクションがありますが、これらは「典型的な」ものです。「余分な」セクションの例は「読み取り専用データ」セクションです。これは、「コード」セクションに格納するのではなく、たとえば文字列データを格納するために使用できます。

実行可能ファイルがロードされると、OS によってさらに 2 つのセクションが作成されます。

  • 関数内のローカル変数を保持するために使用され、呼び出し元の関数に「戻る」ためにも使用されるスタック。通常、スタックのサイズはかなり制限されていますが、以前ほど小さくはありません。最近では、スタックは常に「数メガバイト」のサイズ範囲にあります。私が最初に使用したマシンには、256 バイトのスタックがありました (ハードコードされていました)。それ以上が必要な場合は、独自のソフトウェア定義スタックを作成して調整する必要がありました。あまり楽しくない!

  • ヒープ。これは、「動的割り当て」に使用されます。たとえば、プログラムの入力によってサイズが異なる配列のストレージを作成する場合などです。プログラムの実行が開始されるまで、ヒープの内容はわかりません。最新のシステムでは、ヒープは小さいサイズから開始し、拡大することができます (ただし、マシン自体がメモリ不足になった場合、他に何もないとしても制限がありますが、多くの場合、制限はシステム構成からの制限よりも低くなる場合があります)。 、1 つのアプリケーションがマシンのすべてのメモリを使い果たすのを避けるため)。

上記の例でDPは、「未初期化データ」セクションにあります。

于 2013-07-09T09:51:46.983 に答える
1

静的メモリを使用して格納DPします。基本的newには/を使用して動的に割り当てるのと同じでmalloc()、メモリを管理する必要はありません。

于 2013-07-09T09:27:50.363 に答える
1

ヒープ メモリではなくグローバル メモリを使用し、起動時に OS によって事前に割り当てられます。関数に対してローカルではないため、スタックのサイズは関係ありません。

于 2013-07-09T09:27:53.770 に答える
0

C++ では、ユーザー メモリは、ヒープ、スタック、静的 (const を含む) の 3 つのセクションに分割されます。通常、グローバル変数は static セクションにあります。配列のメモリは定義時に割り当てられるため、静的セクションにもあると思います。その上、グローバル配列をヒープに割り当てることに関する記事が見つかりません。誰かがそれを見つけた場合は、@ を付けてください。

于 2013-07-09T09:41:25.750 に答える