Vergleichen von Speicherzuweisungsmethoden

Nachfolgend sehen Sie einen kurzen Vergleich der verschiedenen Speicherzuweisungsmethoden:

Obwohl die Funktionen "GlobalAlloc", "LocalAlloc" und "HeapAlloc" letztendlich Speicher aus demselben Heap zuordnen, stellt jede eine geringfügig andere Funktionalität bereit. Beispielsweise kann HeapAlloc angewiesen werden, eine Ausnahme zu auslösen, wenn der Arbeitsspeicher nicht zugewiesen werden konnte, eine Funktion, die nicht mit LocalAlloc verfügbar ist. LocalAlloc unterstützt die Zuordnung von Handlen, mit denen der zugrunde liegende Arbeitsspeicher durch eine Umlagerung verschoben werden kann, ohne den Handlewert zu ändern, eine Funktion, die nicht mit HeapAlloc verfügbar ist.

Ab 32-Bit-Windows werden GlobalAlloc und LocalAlloc als Wrapperfunktionen implementiert, die HeapAlloc mithilfe eines Handles zum Standard-Heap des Prozesses aufrufen. Daher haben GlobalAlloc und LocalAlloc mehr Aufwand als HeapAlloc.

Da die verschiedenen Heap-Allocatoren durch unterschiedliche Mechanismen unterschiedliche Funktionen bieten, müssen Sie Arbeitsspeicher mit der richtigen Funktion freimachen. Der mit HeapAlloc zugewiesene Speicher muss beispielsweise mit HeapFree und nicht mit LocalFree oder GlobalFree freigegeben werden. Der mit GlobalAlloc oder LocalAlloc zugewiesene Speicher muss abgefragt, überprüft und mit der entsprechenden globalen oder lokalen Funktion freigegeben werden.

Mit der VirtualAlloc-Funktion können Sie zusätzliche Optionen für die Speicherzuweisung angeben. Ihre Zuordnungen verwenden jedoch eine Seiten granularität, sodass die Verwendung von VirtualAlloc zu einer höheren Speicherauslastung führen kann.

Die Malloc-Funktion hat den Nachteil, abhängig von der Laufzeit zu sein. Der neue Operator hat den Nachteil, vom Compiler abhängig und sprachabhängig zu sein.

Die Funktion CoTaskMemAlloc hat den Vorteil, dass sie in C, C++ oder Visual Basic gut funktioniert. Es ist auch die einzige Möglichkeit, Arbeitsspeicher in einer COM-basierten Anwendung freizugeben, da MIDL CoTaskMemAlloc und CoTaskMemFree zum Marshallspeicher verwendet.

Beispiele

Globale und lokale Funktionen

Heap-Funktionen

Virtuelle Speicherfunktionen