Heap-Funktionen
Jeder Prozess verfügt über einen standardmäßigen 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 aufrufenden Prozesses. Nach dem Erstellen des privaten Heaps verwendet der Prozess Funktionen wie HeapAlloc- und HeapFree- zum Verwalten des Speichers in diesem Heap.
Die Heap-Funktionen können auch zum Verwalten des Speichers im Standardheap des Prozesses verwendet werden, indem das von der GetProcessHeap--Funktion zurückgegebene Handle verwendet wird. Neue Anwendungen sollten die Heapfunktionen anstelle der globalen und lokalen Funktionen verwenden, die zu diesem Zweck.
Es gibt keinen Unterschied zwischen dem von einem privaten Heap zugewiesenen Speicher und dem, die mithilfe der anderen Speicherzuweisungsfunktionen zugewiesen wurden. Eine vollständige Liste der Funktionen finden Sie in der Tabelle in Speicherverwaltungsfunktionen.
Anmerkung
Ein Thread sollte heap-Funktionen nur für die standardmäßigen Heaps und privaten Heaps des Prozesses aufrufen, die der Thread erstellt und verwaltet, wobei Handles verwendet werden, die vom 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 Anfängliche Größe bestimmt die Anzahl der zugesicherten Lese-/Schreibseiten, die dem Heap anfangs zugeordnet wurden. Die maximale Größe bestimmt die Gesamtanzahl 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 Bereich zugesichert, wenn Anforderungen von HeapAlloc die aktuelle Größe von zugesicherten Seiten überschreiten, vorausgesetzt, dass der physische Speicher dafür verfügbar ist. Sobald die Seiten zugesichert wurden, werden sie erst beendet, wenn der Prozess beendet wird, oder bis der Heap zerstört wird, indem die HeapDestroy--Funktion aufgerufen wird.
Auf den Speicher eines privaten Heap-Objekts kann nur der Prozess zugegriffen werden, der es erstellt hat. Wenn eine Dynamic Link Library (DLL) einen privaten Heap erstellt, erfolgt dies im Adressraum des Prozesses, der die DLL aufgerufen hat. Er kann nur für diesen Prozess zugänglich sein.
Die HeapAlloc--Funktion weist eine angegebene Anzahl von Bytes von einem privaten Heap zu und gibt einen Zeiger auf den zugewiesenen Block zurück. Dieser Zeiger kann im HeapFree, HeapReAlloc, HeapSizeund HeapValidate Funktionen verwendet werden.
Der von HeapAlloc zugewiesene Speicher ist nicht verschiebbar. Die von HeapAlloc zurückgegebene Adresse ist gültig, bis der Speicherblock freigegeben oder neu angeordnet 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 geringer Fragmentierung verwenden, um die Heapfragmentierung zu reduzieren.
Eine mögliche Verwendung für die Heap-Funktionen besteht darin, einen privaten Heap zu erstellen, wenn ein Prozess gestartet wird und eine anfängliche Größe angegeben wird, die ausreichend ist, um die Speicheranforderungen des Prozesses zu erfüllen. Wenn der Aufruf der HeapCreate-Funktion fehlschlägt, kann der Prozess den Benutzer über den Speichermangel beenden oder benachrichtigen; Wenn dies erfolgreich ist, ist der Prozess jedoch sicher, dass er den benötigten Speicher benötigt.
Der von HeapCreate angeforderte Arbeitsspeicher kann zusammenhängend sein oder nicht. Der innerhalb eines Heaps zugewiesene Speicher durch HeapAlloc- ist zusammenhängend. Sie sollten nicht in einen Heap schreiben oder aus dem Speicher lesen, außer dass von HeapAlloc-zugewiesen wurde, oder sie sollten keine Beziehung zwischen zwei Speicherbereichen annehmen, die von HeapAlloczugewiesen werden.
Sie sollten auf keine Weise auf den Speicher verweisen, der von HeapFreefreigegeben wurde. Nachdem der Speicher freigegeben wurde, sind alle Informationen, die sich möglicherweise darin befunden haben, für immer verschwunden. Wenn Sie Informationen benötigen, geben Sie keinen Arbeitsspeicher frei, der die Informationen enthält. Funktionsaufrufe, die Informationen zum Arbeitsspeicher (z. B. HeapSize) zurückgeben, werden möglicherweise nicht mit freigegebenen Arbeitsspeicher verwendet, da sie falsch gespeicherte Daten zurückgeben können.
Die HeapDestroy Funktion zerstört ein privates Heapobjekt. Es wird alle Seiten des Heap-Objekts entfernt und losgelassen, und der Handle wird für den Heap ungültig.
Verwandte Themen