メモリ割り当て方法の比較
さまざまなメモリ割り当て方法の簡単な比較を次に示します。
- CoTaskMemAlloc
- GlobalAlloc
- HeapAlloc
- LocalAlloc
- malloc
- new
- VirtualAlloc
GlobalAlloc、LocalAlloc、HeapAlloc の各関数は、最終的に同じヒープからメモリを割り当てますが、それぞれ少し異なる機能セットを提供します。 たとえば、メモリを割り当てられなかった場合に例外を発生するように HeapAlloc に指示できます。 LocalAlloc では使用できない機能です。 LocalAlloc ではハンドルの割り当てがサポートされています。これにより、ハンドル値を変更せずに、基になるメモリを再割り当てによって移動できます。 これは HeapAlloc では使用できない機能です。
32 ビット Windows 以降では、 GlobalAlloc と LocalAlloc は、プロセスの既定のヒープへのハンドルを使用して HeapAlloc を呼び出すラッパー関数として実装されます。 したがって、GlobalAlloc と LocalAlloc は HeapAlloc よりもオーバーヘッドが大きくなります。
異なるヒープ アロケーターは、異なるメカニズムを使用して独自の機能を提供するため、正しい関数を使用してメモリを解放する必要があります。 たとえば、HeapAlloc で割り当てられたメモリは、LocalFree または GlobalFree ではなく HeapFree で解放する必要があります。 GlobalAlloc または LocalAlloc で割り当てられたメモリは、対応するグローバル関数またはローカル関数を使用して照会、検証、解放する必要があります。
VirtualAlloc 関数を使用すると、メモリ割り当ての追加オプションを指定できます。 ただし、その割り当てではページの粒度が使用されるため、 VirtualAlloc を 使用するとメモリ使用量が増加する可能性があります。
malloc 関数には、実行時に依存するという欠点があります。 新しい演算子には、コンパイラに依存し、言語に依存するという欠点があります。
CoTaskMemAlloc 関数には、C、C++、または Visual Basic のいずれかで適切に機能する利点があります。 また、MIDL では CoTaskMemAlloc と CoTaskMemFree を使用してメモリをマーシャリングするため、COM ベースのアプリケーションでメモリを共有する唯一の方法でもあります。
例
関連トピック