Heap-Funktionen

Jeder Prozess verfügt über einen Standard-Heap, der vom System bereitgestellt wird. Anwendungen, die häufige Zuordnungen aus dem Heap vornehmen, können die Leistung mithilfe privater Heaps verbessern.

Ein privater Heap ist ein Block einer oder mehrerer Seiten im Adressraum des Aufrufvorgangs. Nach dem Erstellen des privaten Heaps verwendet der Prozess Funktionen wie HeapAlloc und HeapFree , um den Speicher in diesem Heap zu verwalten.

Die Heap-Funktionen können auch zum Verwalten des Arbeitsspeichers im Standard-Heap des Prozesses verwendet werden, indem der von der GetProcessHeap-Funktion zurückgegebene Handle verwendet wird. Neue Anwendungen sollten die Heapfunktionen anstelle der globalen und lokalen Funktionen für diesen Zweck verwenden.

Es gibt keinen Unterschied zwischen dem Speicher, der von einem privaten Heap zugewiesen wird und der mithilfe der anderen Speicherzuweisungsfunktionen zugewiesen wird. Eine vollständige Liste der Funktionen finden Sie in der Tabelle in Speicherverwaltungsfunktionen.

Hinweis

Ein Thread sollte heap-Funktionen nur für die Standard-Heap- und privaten Heaps des Prozesses aufrufen, die der Thread erstellt und verwaltet, indem die vom GetProcessHeap - oder HeapCreate-Funktion zurückgegebenen Handle verwendet werden.

 

Die HeapCreate-Funktion erstellt ein privates Heap-Objekt, aus dem der Aufrufprozess Speicherblöcke mithilfe der HeapAlloc-Funktion zuweisen kann. HeapCreate gibt sowohl eine anfängliche Größe als auch eine maximale Größe für den Heap an. Die anfängliche Größe bestimmt die Anzahl der zugewiesenen, lese-/schreibgeschützten Seiten für den Heap. Die maximale Größe bestimmt die Gesamtzahl der reservierten Seiten. Diese Seiten erstellen einen zusammenhängenden Block im virtuellen Adressraum eines Prozesses, in dem der Heap wachsen kann. Zusätzliche Seiten werden automatisch aus diesem reservierten Bereich verpflichtet, wenn Anforderungen von HeapAlloc die aktuelle Größe von gebundenen Seiten überschreiten, vorausgesetzt, dass der physische Speicher für sie verfügbar ist. Sobald die Seiten verpflichtet sind, werden sie erst beendet, wenn der Prozess beendet wird oder bis der Heap zerstört wird, indem die HeapDestroy-Funktion aufgerufen wird.

Der Speicher eines privaten Heap-Objekts ist nur für den Prozess zugänglich, der es erstellt hat. Wenn eine dynamische Linkbibliothek (DLL) einen privaten Heap erstellt, wird dies im Adressraum des Prozesses ausgeführt, der die DLL aufgerufen hat. Es ist nur für diesen Prozess zugänglich.

Die HeapAlloc-Funktion weist eine angegebene Anzahl von Bytes aus einem privaten Heap zu und gibt einen Zeiger zum zugewiesenen Block zurück. Dieser Zeiger kann in den Funktionen HeapFree, HeapReAlloc, HeapSize und HeapValidate verwendet werden.

Der von HeapAlloc zugewiesene Speicher ist nicht verschiebbar. Die von HeapAlloc zurückgegebene Adresse ist gültig, bis der Speicherblock frei oder neu verschoben wird; Der Speicherblock muss nicht gesperrt werden.

Da das System einen privaten Heap nicht komprimieren kann, kann es fragmentiert werden. Anwendungen, die große Speichermengen in verschiedenen Zuordnungsgrößen zuweisen, können den Heap-Heap mit niedriger Fragmentierung verwenden, um die Heap-Fragmentierung zu verringern.

Eine mögliche Verwendung für die Heap-Funktionen besteht darin, einen privaten Heap zu erstellen, wenn ein Prozess gestartet wird, der eine anfängliche Größe angibt, die für die Speicheranforderungen des Prozesses ausreichend ist. Wenn der Aufruf der HeapCreate-Funktion fehlschlägt, kann der Prozess den Benutzer über den Speichermangel beenden oder benachrichtigen; wenn es erfolgreich ist, ist der Prozess jedoch sicher, dass der Speicher benötigt wird.

Der von HeapCreate angeforderte Speicher kann nicht zusammenhängend sein. Der von HeapAlloc zugewiesene Speicher ist zusammenhängend. Sie sollten nicht in einen Heap-Heap schreiben oder aus dem Speicher lesen, mit Ausnahme der von HeapAlloc zugewiesenen, oder sie sollten keine Beziehung zwischen zwei Von HeapAlloc zugewiesenen Speicherbereichen annehmen.

Sie sollten sich nicht auf den Speicher beziehen, der von HeapFree freigestellt wurde. Nachdem der Speicher freigestellt wurde, sind alle Informationen, die möglicherweise in ihr enthalten sind, immer verschwunden. Wenn Sie Informationen benötigen, können Sie keinen freien Arbeitsspeicher mit den Informationen enthalten. Funktionsaufrufe, die Informationen zu Arbeitsspeicher (z. B. HeapSize) zurückgeben, werden möglicherweise nicht mit freigestelltem Arbeitsspeicher verwendet, da sie falsch zurückgegebene Daten zurückgeben können.

Die Funktion "HeapDestroy" zerstört ein privates Heap-Objekt. Es wird alle Seiten des Heap-Objekts dekommittiert und veröffentlicht, und er ungültigt den Handle zum Heap.

Vergleich von Speicherzuweisungsmethoden