Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

仮想アドレス空間の確保のAPIの使い分けについては以下を参照。

LocalAlloc?

Win16時代の名残で新しいAPIでは使用しなくてよい。

GlobalAlloc?

Win16時代の名残で利用は推奨されないが、
DDE 関数とクリップボード関数では、依然としてGlobalAlloc?関数が使われる。

GlobalAlloc?でGMEM_MOVEABLE(移動可能メモリ)を指定すると メモリのハンドルが返り、それを使用してGlobalLock?で仮想アドレスを取得する。 これにより仮想アドレスへのマップをOSに管理させる事ができる(物理メモリ確保のみの状態 = ワーキングセット)。 (Win16時代は物理メモリのマップをOSに管理させていたが、Win32では、仮想メモリのマップをOSに管理させるようになった。) このため、GlobalFree?GlobalUnlock?GlobalLock?で仮想アドレス上の断片化を発生させないように処理を実装できる。  ただし、ハンドルリークや、小さいメモリ領域を多数確保する場合は断片化が発生し易い。

VirtualAlloc?

HeapAlloc?

ただし、大量の異なるサイズの領域確保・解放を繰り返す場合は、断片化が発生する。
ADO(MDAC)を使用して、大量データの結果セットを取得・解放を繰り替えすプログラムで
ADO(MDAC)の追加メモリを倍々でReservedするアルゴリズムによりに断片化が発生した事例がある。

malloc (new)

データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりする。
またマルチスレッドに対する耐性があるバージョンも存在し、賢いが、その分遅い。
一般的には最後にHeapAlloc?を呼び出す結果になる。

ExAllocatePoolWithTag?

メモリ プール(ページ プールおよび非ページ プール)を割り当てるAPI


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS