グローバル関数とローカル関数

グローバル関数とローカル関数は、16 ビット コードからの移植、または 16 ビット Windows とのソース コードの互換性を維持するためにサポートされています。 32 ビット Windows 以降では、グローバル関数とローカル関数は、プロセスの既定のヒープへのハンドルを使用して対応する ヒープ関数 を呼び出すラッパー関数として実装されます。 したがって、グローバル関数とローカル関数は、他のメモリ管理機能よりもオーバーヘッドが大きくなります。

ヒープ関数は、グローバル関数とローカル関数よりも多くの機能と制御を提供します。 新しいアプリケーションでは、グローバル関数またはローカル関数を使用する必要があることを特にドキュメントに記載していない限り、ヒープ関数を使用する必要があります。 たとえば、一部の Windows 関数は LocalFree で解放する必要があるメモリを割り当てますが、グローバル関数は動的データ交換 (DDE)、クリップボード関数、OLE データ オブジェクトで引き続き使用されます。 グローバル関数とローカル関数の完全な一覧については、「 メモリ管理機能」の表を参照してください。

Windows メモリ管理では、16 ビット Windows と同様に、個別のローカル ヒープとグローバル ヒープは提供されません。 その結果、グローバルおよびローカルの関数ファミリは同等であり、それらを選択することは個人の好みの問題です。 16 ビットセグメント化メモリ モデルから 32 ビット仮想メモリ モデルへの変更により、関連するグローバル関数とローカル関数の一部とそのオプションが不要または無意味になったことに注意してください。 たとえば、ローカル割り当てとグローバル割り当ての両方で 32 ビットの仮想アドレスが返されるため、近いポインターと遠くにあるポインターはなくなりました。

GlobalAllocLocalAlloc によって割り当てられたメモリ オブジェクトは、他のプロセスがアクセスできない読み取り/書き込みアクセス権を持つプライベートなコミット済みページにあります。 GMEM_DDESHAREGlobalAlloc を使用して割り当てられたメモリは、16 ビット Windows では実際にはグローバルに共有されません。 この値は無効であり、互換性のためにのみ使用できます。 他の目的で共有メモリを必要とするアプリケーションでは、ファイル マッピング オブジェクトを使用する必要があります。 複数のプロセスで、同じファイル マッピング オブジェクトのビューをマップして、名前付き共有メモリを提供できます。 詳細については、「 ファイル マッピング」を参照してください。

メモリ割り当ては、ディスク上のページング ファイル内のストレージを含め、使用可能な物理メモリによってのみ制限されます。 固定メモリを割り当てると、 GlobalAllocLocalAlloc は、呼び出し元のプロセスがメモリへのアクセスにすぐに使用できるポインターを返します。 移動可能メモリを割り当てると、戻り値はハンドルになります。 移動可能なメモリ オブジェクトへのポインターを取得するには、 GlobalLock 関数と LocalLock 関数を使用します。

割り当てられたメモリの実際のサイズは、要求されたサイズよりも大きくなる可能性があります。 割り当てられた実際のバイト数を確認するには、 GlobalSize 関数または LocalSize 関数を使用します。 割り当てられた金額が要求された金額より大きい場合、プロセスは金額全体を使用できます。

GlobalReAlloc 関数と LocalReAlloc 関数は、GlobalAlloc および LocalAlloc によって割り当てられたメモリ オブジェクトのサイズまたは属性を変更します。 サイズは増減できます。

GlobalFree 関数と LocalFree 関数は、GlobalAlloc、LocalAllocGlobalReAlloc、または LocalReAlloc によって割り当てられたメモリを解放します。 ハンドルを無効にせずに指定されたメモリ オブジェクトを破棄するには、 GlobalDiscard 関数または LocalDiscard 関数を使用します。 このハンドルは、 後で GlobalReAlloc または LocalReAlloc で使用して、同じハンドルに関連付けられている新しいメモリ ブロックを割り当てることができます。

指定したメモリ オブジェクトに関する情報を返すには、 GlobalFlags または LocalFlags 関数を 使用します。 この情報には、オブジェクトのロックカウントが含まれており、オブジェクトが破棄可能であるか、既に破棄されているかを示します。 指定したポインターに関連付けられているメモリ オブジェクトへのハンドルを返すには、 GlobalHandle または LocalHandle 関数を使用します。

メモリ割り当て方法の比較