Vergleichen von Speicherbelegungsmethoden
Es folgt ein kurzer Vergleich der verschiedenen Speicherbelegungsmethoden:
- CoTaskMemAlloc
- Globalalloc
- HeapAlloc
- LocalAlloc
- malloc
- new
- VirtualAlloc
Obwohl die Funktionen GlobalAlloc, LocalAlloc und HeapAlloc letztendlich Arbeitsspeicher aus demselben Heap zuordnen, bietet jede einen etwas anderen Funktionsumfang. Beispielsweise kann HeapAlloc angewiesen werden, eine Ausnahme auszulösen, wenn arbeitsspeicher nicht zugeordnet werden konnte, eine Funktion, die für LocalAlloc nicht verfügbar ist. LocalAlloc unterstützt die Zuordnung von Handles, die es ermöglichen, den zugrunde liegenden Speicher durch eine Neuzuordnung zu verschieben, ohne den Handle-Wert zu ändern, eine Funktion, die für HeapAlloc nicht verfügbar ist.
Ab 32-Bit-Windows werden GlobalAlloc und LocalAlloc als Wrapperfunktionen implementiert, die HeapAlloc mithilfe eines Handles für den Standardheap des Prozesses aufrufen. Daher haben GlobalAlloc und LocalAlloc einen höheren Mehraufwand als HeapAlloc.
Da die verschiedenen Heap-Zuweisungen durch die Verwendung verschiedener Mechanismen unterschiedliche Funktionen bieten, müssen Sie Arbeitsspeicher mit der richtigen Funktion freigeben. Beispielsweise muss der mit HeapAlloc zugeordnete Arbeitsspeicher mit HeapFree und nicht mit LocalFree oder GlobalFree freigegeben werden. Der mit GlobalAlloc oder LocalAlloc zugeordnete Arbeitsspeicher muss mit der entsprechenden globalen oder lokalen Funktion abgefragt, überprüft und freigegeben werden.
Mit der VirtualAlloc-Funktion können Sie zusätzliche Optionen für die Speicherbelegung angeben. Seine Zuordnungen verwenden jedoch eine Seitengranularität, sodass die Verwendung von VirtualAlloc zu einer höheren Speicherauslastung führen kann.
Die Malloc-Funktion hat den Nachteil, dass sie von der Laufzeit abhängig ist. Der neue Operator hat den Nachteil, compilerabhängig und sprachabhängig zu sein.
Die CoTaskMemAlloc-Funktion hat den Vorteil, dass sie in C, C++ oder Visual Basic gut funktioniert. Dies ist auch die einzige Möglichkeit, Arbeitsspeicher in einer COM-basierten Anwendung freizugeben, da MIDL CoTaskMemAlloc und CoTaskMemFree zum Marshallen von Arbeitsspeicher verwendet.
Beispiele
Zugehörige Themen