HeapCreate |
Declare Function Api_HeapCreate& Lib "kernel32" Alias "HeapCreate" (ByVal flOptions&, ByVal dwInitialSize&, ByVal dwMaximumSize&) |
||||||
Declare Function HeapCreate Lib "kernel32" Alias "HeapCreate" (ByVal flOptions As Long, ByVal dwInitialSize As Long, ByVal dwMaximumSize As Long) As Long |
|||||||
呼び出し側プロセスが使用できるヒープオブジェクトを作成する。この関数は、プロセスの仮想アドレス空間内の領域を予約し、このブロック内の指定された初期のパートに物理格納域を割り当てる。 |
|||||||
パラメータ プ関数を呼び出してこの新しいヒープにアクセスする際に、これらのオプションは影響を及ぼす。次の値のいずれかまたは任意の組み合わせ を指定できる。
dwInitialSize
決定する。この値は、ページ単位へ切り上げられる。ホストコンピュータのページサイズを調べるには、 関数を使う。 を次のページ領域へ切り上げ、プロセスの仮想アドレス空間内で、そのサイズのブロックをそのヒープ用に予約する。HeapAlloc または HeapReAlloc 関数が、dwInitialSize で指定された初期の物理格納域の量を超える割り当てを要求すると、システムはヒープの最大サイ
ズを超えない限り、そのヒープに物理格納域の追加ページを割り当てる。 内の各メモリブロックの最大サイズは、0x7FFF8(10 進の 524,280)バイトより少し小さなサイズに制限される。このサイズを超えるブロックの
割り当てを要求すると、たとえヒープがそのブロックを収容できる十分な大きさであっても、その割り当ては失敗する。 0x7FFF8 バイトを超えるブロックの割り当てを要求しても、自動的に失敗することはない。システムはそのような大きなブロックが必要とする メモリを取得するために、VirtualAlloc を呼び出す。大きなメモリブロックを割り当てる必要があるアプリケーションでは、dwMaximumSize
に 0 を指定する。 モリブロックの割り当てを行える。初期のサイズは、最初にそのヒープへコミットされるページ数を決定する。最大サイズは、予約済みページ の合計ページ数を決定する。これらの予約済みページは、プロセスの仮想アドレス空間内に 1 つのブロックを作成し、ヒープはそのブロック 内で拡張できる。HeapAlloc 関数を使って、現在のコミット済みページ数を超える割り当てを要求した場合は、物理格納域が利用可能で
ある限り、予約済みの空間へ追加のページが自動的にコミットされる。 ライベートヒープを作成した場合、そのヒープはその DLL を呼び出したプロセスのアドレス空間内に作成され、そのプロセスだけがそのヒープ
にアクセスできる。 すべてを利用できるわけではない。たとえば、HeapAlloc 関数を使ってあるヒープを作成し、最大サイズとして 64 キロバイト(KB)を指定した
場合、64KB
の割り当てを要求すると、システムのオーバーヘッドが原因でその割り当てに失敗することがある。 ると、複数のスレッドが同じヒープでメモリブロックの割り当てまたは解放を行おうとしたときに、相互排他が保証される。パフォーマンスは多
少低下するが、複数のスレッドが同じヒープでメモリの割り当てまたは解放を行う場合は、必ずシリアル化を有効にしなければならない。 数のスレッドがメモリの割り当てまたは解放を同時に行う可能性があり、その場合はヒープが壊れてしまう。そのため、
HEAP_NO_SERIALIZE
を安全に利用できるのは、次の条件のいずれかが成立する場合だけである。 |