Heapfunktionen

Jeder Prozess verfügt über einen vom System bereitgestellten Standardhap. Anwendungen, die häufig Zuordnungen aus dem Heap erstellen, können die Leistung mithilfe privater Heaps verbessern.

Ein privater Heap ist ein Block aus mindestens einer Seite im Adressraum des aufrufenden Prozesses. Nach dem Erstellen des privaten Heaps verwendet der Prozess Funktionen wie HeapAlloc und HeapFree, um den Arbeitsspeicher in diesem Heap zu verwalten.

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

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

Hinweis

Ein Thread sollte Heapfunktionen nur für den Standardheap und die privaten Heaps des Prozesses aufrufen, die der Thread erstellt und verwaltet, indem handles verwendet werden, die von der GetProcessHeap- oder HeapCreate-Funktion zurückgegeben werden.

Die HeapCreate-Funktion erstellt ein privates Heapobjekt, aus dem der aufrufende Prozess Speicherblöcke mithilfe der HeapAlloc-Funktion zuordnen kann. HeapCreate gibt sowohl eine Anfangsgröße als auch eine maximale Größe für den Heap an. Die Anfangsgröße bestimmt die Anzahl der Seiten, für die ein Committed erfolgt ist, lese-/schreibeseiten, die dem Heap anfänglich zugeordnet wurden. Die maximale Größe bestimmt die Gesamtzahl der reservierten Seiten. Diese Seiten erstellen einen zusammenhängenden Block im virtuellen Adressraum eines Prozesses, in den der Heap wachsen kann. Zusätzliche Seiten werden automatisch von diesem reservierten Speicherplatz aus gebunden, wenn Anforderungen von HeapAlloc die aktuelle Größe der seiten, für die ein Committed ausgeführt wurde, überschreiten, vorausgesetzt, der physische Speicher dafür ist verfügbar. Nachdem für die Seiten ein Committed abgeschlossen wurde, wird derComcommitted erst aufgehoben, wenn der Prozess beendet oder der Heap durch Aufrufen der HeapDestroy-Funktion zerstört wird.

Der Arbeitsspeicher eines privaten Heapobjekts ist nur für den Prozess zugänglich, der es erstellt hat. Wenn eine Dll (Dynamic Link Library) einen privaten Heap erstellt, wird dies im Adressraum des Prozesses, der die DLL aufgerufen hat, verwendet. Sie 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 auf den zugeordneten Block zurück. Dieser Zeiger kann in den Funktionen HeapFree, HeapReAlloc, HeapSizeund HeapValidate verwendet werden.

Der von HeapAlloc zugeordnete Arbeitsspeicher kann nicht verschiebbar sein. Die von HeapAlloc zurückgegebene Adresse ist gültig, bis der Speicherblock frei oder neu zugewiesen wird. der Speicherblock muss nicht gesperrt werden.

Da das System einen privaten Heap nicht komprimieren kann, kann er fragmentiert werden. Anwendungen, die große Mengen an Arbeitsspeicher in verschiedenen Zuordnungsgrößen zuordnen, können den Heap mit geringer Fragmentierung verwenden, um die Heapfragmentierung zu reduzieren.

Eine mögliche Verwendung für die Heapfunktionen besteht in der Erstellung eines privaten Heaps beim Starten eines Prozesses. Dabei wird eine anfangs ausreichende Größe angegeben, um die Arbeitsspeicheranforderungen des Prozesses zu erfüllen. Wenn der Aufruf der HeapCreate-Funktion fehlschlägt, kann der Prozess beendet oder den Benutzer über den Arbeitsspeichermangel benachrichtigen. Wenn er erfolgreich ist, ist der Prozess jedoch sicher, dass er über den benötigten Arbeitsspeicher versiert ist.

Der von HeapCreate angeforderte Arbeitsspeicher ist möglicherweise zusammenhängend. Der von HeapAlloc innerhalb eines Heaps zugeordnete Arbeitsspeicher ist zusammenhängend. Sie sollten nicht in den Arbeitsspeicher in einem Heap schreiben oder aus ihm lesen, außer in den von HeapAlloc zugeordneten , und Sie sollten auch keine Beziehung zwischen zwei Bereichen des von HeapAlloc zugeordneten Arbeitsspeichers annehmen.

Sie sollten nicht auf Arbeitsspeicher verweisen, der von HeapFree frei wurde. Nachdem der Arbeitsspeicher frei wurde, sind alle Informationen, die möglicherweise enthalten waren, für immer verloren. Wenn Sie Informationen benötigen, geben Sie keinen Arbeitsspeicher frei, der die Informationen enthält. Funktionsaufrufe, die Informationen zum Arbeitsspeicher zurückgeben (z. B. HeapSize),können nicht mit dem freien Arbeitsspeicher verwendet werden, da sie möglicherweise datenverfeckte Daten zurückgeben.

Die HeapDestroy-Funktion zerstört ein privates Heapobjekt. Er decommitiert und gibt alle Seiten des Heapobjekts frei und macht das Handle für den Heap ungültig.

Vergleichen von Speicherzuordnungsmethoden