表示: Delphi C++
表示設定

Win 32 プラットフォームのメモリ管理

提供:RAD Studio
移動: 案内, 検索

メモリ管理:インデックス への移動

ここでは、Win32 のメモリ管理の方法について説明します。また、変数のメモリの問題についても簡単に説明します。

目次

メモリ マネージャ(Win32 のみ)

メモリ マネージャは、アプリケーション内のすべての動的なメモリ割り当てと割り当て解除を管理します。 New、Dispose、GetMem、ReallocMem、および FreeMem の標準プロシージャはメモリ マネージャを使用します。また、すべてのオブジェクトと長い文字列はメモリ マネージャを通して割り当てられます。

メモリ マネージャは、小から中サイズのメモリ ブロックを多数割り当てるアプリケーション用に最適化されています。このようなアプリケーションは、オブジェクト指向アプリケーションや文字列データを処理するアプリケーションによく見られます。 メモリ マネージャは、シングルスレッドおよびマルチスレッド アプリケーションに対して、(高速でメモリ オーバーヘッドが少ない)効率的な処理が行えるように最適化されています。 このような環境で他のメモリ マネージャ(GlobalAlloc、LocalAlloc、Windows のプライベート ヒープ サポートの実装など)を直接使用すると、効率よく動作せず、アプリケーションの処理速度が低下することがあります。

処理効率を最大限生かすためには、メモリ マネージャを Win32 仮想メモリ API(VirtualAlloc 関数と VirtualFree 関数)と直接やり取りさせます。 メモリ マネージャは、最大 4GB までのユーザー モードのアドレス空間をサポートします。

メモリ マネージャのメモリ ブロックは、常に 4 バイトの倍数のサイズに切り上げられており、4 バイトのヘッダーを含んでいます。ヘッダーには、ブロック サイズとその他のステータス ビットが格納されています。 メモリ ブロックの開始アドレスは、常に最低でも 8 バイト境界、オプションによっては 16 バイト境界上に並んでいるため、アドレス時のパフォーマンスが向上します。

メモリ マネージャは、将来メモリ ブロックが再割り当てされることを予想して、再割り当て操作に関連するパフォーマンスの低下を軽減するアルゴリズムを採用しています。 この再割り当てアルゴリズムは、アドレス空間の断片化を軽減することにも役立ちます。

メモリ マネージャは、外部 DLL を必要としない共有メカニズムを提供しています。

メモリ マネージャには、アプリケーションが自身のメモリ使用状況と潜在的なメモリ リークを監視するのに役立つレポート機能が用意されています。

メモリ マネージャは、GetMemoryManagerState と GetMemoryMap という 2 つのプロシージャを提供しています。これらを利用して、アプリケーションは、メモリ マネージャのステータス情報や詳細なメモリ使用マップを取得できます。

変数

グローバル変数は、アプリケーションのデータ セグメントに割り当てられ、プログラムの実行中は存続し続けます。 プロシージャや関数の中で宣言された変数はローカル変数と呼ばれ、アプリケーションのスタックに保持されます。 プロシージャや関数が呼び出されるたびにローカル変数が割り当てられ、終了時にローカル変数は廃棄されます。 コンパイラの最適化によって、変数が早い段階で破棄されることもあります。

Win32 では、アプリケーションのスタックは、次の 2 つの値で定義されます: 最小スタック サイズおよび最大スタック サイズ。この 2 つの値は $MINSTACKSIZE$MAXSTACKSIZE コンパイラ指令によって制御されます。それぞれのデフォルト値は 16,384(16K)と 1,048,576(1MB)です。 アプリケーションは最小スタック サイズを利用できるように保証されています。また、アプリケーションのスタックが最大スタック サイズより大きくなることは決してありません。 アプリケーションの最小スタック サイズ要件を満たす十分なメモリが利用できない場合は、そのアプリケーションを起動しようとすると Windows からエラーが出されます。

Win32 アプリケーションで、最小スタック サイズで指定されているよりも多くのスタック領域が必要な場合は、追加のメモリが 4K 単位で自動的に割り当てられます。 追加メモリが利用できないか、スタックの合計サイズが最大スタック サイズを超えるため、追加スタック領域の割り当てに失敗した場合は、EStackOverflow 例外が生成されます。(スタック オーバーフローのチェックは完全に自動化されています。 従来オーバーフロー チェックを制御していた $S コンパイラ指令は、下位互換性のために残されています)。

GetMem または New プロシージャで作成した動的変数はヒープに割り当てられ、FreeMem または Dispose で割り当てを解除されるまで存続します。

長い文字列、ワイド文字列、動的配列、バリアント、およびインターフェイスはヒープに割り当てられますが、それらのメモリは自動的に管理されます。

関連項目

コード サンプル

他言語版