3

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

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

4

7 に答える 7

18

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

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

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

于 2008-10-28T15:54:53.440 に答える
4

処理するデータが大量にある場合や、とにかく独自のメモリ マネージャーを作成する必要がある場合は、VirtualAlloc とその仲間が少し有利になります。

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

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

また、アドレス空間の予約と実際のメモリ要求も区別されます。そこまで面倒なことをする正当な理由があるなら、そこにはいくつかの素晴らしいものがあります。

于 2008-10-29T03:47:36.167 に答える
3

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

于 2008-10-28T16:01:58.057 に答える
2

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

BUT: 正当な理由がない場合は、malloc/free/resize 関数に固執する必要があります。また、割り当てられたメモリの権限を変更する必要がある場合 (例: 実行可能かどうかを確認するなど)、VirtualAlloc、VirtualFree などの関数を使用する必要があります。

于 2008-10-28T18:01:36.460 に答える
1

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

于 2008-10-28T18:06:47.540 に答える
0

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

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

カスタムヒープマネージャー(独自のヒープ*関数のセット)を実装する場合を除いて、VirtualAllocに移行してもそれほど多くは購入できません。

于 2009-02-02T09:20:48.310 に答える
0

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

于 2008-10-28T16:05:44.027 に答える