最新の 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
は、「未初期化データ」セクションにあります。