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

さまざまなメモリ割り当て方法の簡単な比較を次に示します。

GlobalAllocLocalAllocHeapAlloc の各関数は、最終的に同じヒープからメモリを割り当てますが、それぞれ少し異なる機能セットを提供します。 たとえば、メモリを割り当てられなかった場合に例外を発生するように HeapAlloc に指示できます。 LocalAlloc では使用できない機能です。 LocalAlloc ではハンドルの割り当てがサポートされています。これにより、ハンドル値を変更せずに、基になるメモリを再割り当てによって移動できます。 これは HeapAlloc では使用できない機能です。

32 ビット Windows 以降では、 GlobalAllocLocalAlloc は、プロセスの既定のヒープへのハンドルを使用して HeapAlloc を呼び出すラッパー関数として実装されます。 したがって、GlobalAllocLocalAlloc は HeapAlloc よりもオーバーヘッドが大きくなります。

異なるヒープ アロケーターは、異なるメカニズムを使用して独自の機能を提供するため、正しい関数を使用してメモリを解放する必要があります。 たとえば、HeapAlloc で割り当てられたメモリは、LocalFree または GlobalFree ではなく HeapFree で解放する必要があります。 GlobalAlloc または LocalAlloc で割り当てられたメモリは、対応するグローバル関数またはローカル関数を使用して照会、検証、解放する必要があります。

VirtualAlloc 関数を使用すると、メモリ割り当ての追加オプションを指定できます。 ただし、その割り当てではページの粒度が使用されるため、 VirtualAlloc を 使用するとメモリ使用量が増加する可能性があります。

malloc 関数には、実行時に依存するという欠点があります。 新しい演算子には、コンパイラに依存し、言語に依存するという欠点があります。

CoTaskMemAlloc 関数には、C、C++、または Visual Basic のいずれかで適切に機能する利点があります。 また、MIDL では CoTaskMemAllocCoTaskMemFree を使用してメモリをマーシャリングするため、COM ベースのアプリケーションでメモリを共有する唯一の方法でもあります。

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

ヒープ関数

仮想メモリ関数