質問

Windows Cプログラミングで推奨される方法を知りたい:mallocまたはWin32 HeapAlloc(おそらくVirtualAlloc?)関数を使用します。

MSDN メモリ管理関数およびmallocとHeapAllocに関するMSDNの記事ですが、どちらをどのような状況で使用すべきかについては言及していません。

役に立ちましたか?

解決

異なるものを使用する説得力のある理由がない限り、mallocを使用してください。 OSメモリ割り当てプリミティブの観点から下に実装されますが、自分でその層に飛び込むことには本当の利点はありません。

Windowsヒープから割り当てられたメモリブロックが必要と思われるAPI呼び出しがいくつかありますが、それらに遭遇したときはわかります。

または、共有メモリの使用など、より高度な操作を行う場合、またはメモリページのアクセス許可を直接制御する必要がある場合は、VirtualAllocなどのWindows API呼び出しを確認する必要があります。

他のヒント

VirtualAllocとその友人は、処理するデータの山がある場合や、とにかく独自のメモリマネージャーを作成する手間をかける必要がある場合に、少し優位に立つことができます。

それ以外の場合は、malloc()を使用する方が簡単で、もちろん移植性があります。

VirtualAllocには、MEM_RESETと呼ばれるこの便利な機能があります。これは、メモリブロック内のデータを無効にしますが、割り当てたままにします。これは、ディスクにページングされた場合、次にアクセスするときにWindowsがページングすることを意味しません。突然不必要になる可能性のある大量のデータがある場合は便利ですが、すぐにバッファを埋めるために何か他のものが用意されます。

また、アドレス空間の予約と実際のメモリの要求を区別します。すべての問題に取り組む正当な理由がある場合は、いくつかの素晴らしいものがあります。

もう1つ:malloc()は(少なくともANSI-C実装に対して)移植性があり、よりエレガントであることが保証されています。

HeapAllocなどの関数を使用する状況では、HeapFreeにより作業が楽になります。 1つの例は、1つのモジュール(library1.dllなど)にメモリを割り当て、メインモジュール(program.exeなど)でそのメモリを解放する必要がある大きなアプリケーションです。これは、HeapAlloc、HeapResize、およびHeapFree関数を使用している場合は安全に実行できますが、Cランタイムライブラリ(malloc、free、resizeなど)を使用して実行することはできません。

ただし、正当な理由がない場合は、malloc / free / resize関数を使用する必要があります。 また、割り当てられたメモリの許可を変更する必要がある場合(例:実行可能ファイルを作成するなど)、VirtualAlloc、VirtualFreeなどの関数を使用する必要があります。

ラッパーを作成し、実装の詳細を変更するオプションを残すことができます。両方のオプションをコードと比較して決定することもできます。

Robとは異なり、別の方法で行います... WinAPIに対してコーディングすることを選択したため、Cランタイム関数の代わりにネイティブ関数を使用します。

HeapAllocを使用すると、さまざまなタスク/サブシステムに個別のヒープを設定できます。これにより、大規模なアプリケーションのダンプ分析が簡単になる場合があります。

mallocを使用すると1つのヒープしか使用できませんが、CRT作成者がOS HeapAllocの上に実装した可能性のある割り当ての最適化が得られます。

カスタムヒープマネージャー(独自のHeap *関数セット)を実装したい場合を除き、VirtualAllocに降りてもあまりお金はかかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top