Vergleich der Speicherzuordnungsmethoden

Auswählen der richtigen Zuordnungsmethode

Verwenden Sie die folgenden Anleitungen, um die entsprechende Speicherzuordnungs-API für Ihr Szenario auszuwählen:

Szenario Empfohlene API Hinweise
Allgemeine C++-Zuordnungen new / std::make_unique / std::make_shared Standardauswahl für C++-Code. Verwendet den CRT-Heap intern. RAII stellt die automatische Bereinigung sicher.
Allgemeine C-Zuweisungen malloc / calloc / realloc Standardauswahl für C-Code. Portierbar über Plattformen hinweg.
Zuordnungen größer als ~1 MB oder Erfordern eines Steuerelements auf Seitenebene Virtualalloc Ordnet die Seiten granularität zu (in der Regel 4 KB). Dient zum Reservieren großer Adressbereiche, Schutzseiten oder Speicher mit spezifischen Schutzattributen (PAGE_READWRITE, PAGE_EXECUTE_READusw.).
Viele kleine Zuordnungen mit benutzerdefiniertem Steuerelement (z. B. Pool-Allocator) HeapAlloc / HeapCreate Erstellen Sie einen privaten Heap für isolations- oder Serialisierungssteuerelemente. Wird nur verwendet HEAP_NO_SERIALIZE , wenn der Heap ausschließlich singlethreaded ist.
COM-Interoperabilität (gemarsteter Speicher) CoTaskMemAlloc- Erforderlich, wenn der Speicher COM-Apartmentgrenzen überschreitet. MIDL-generierte Stubs verwenden CoTaskMemAlloc/CoTaskMemFree.
Legacycode mit verschiebebarem Arbeitsspeicher Globalalloc / LocalAlloc Vermeiden Sie neuen Code. Diese fügen mehr Aufwand über HeapAlloc hinzu und sind in erster Linie für die Abwärtskompatibilität mit Zwischenablagevorgängen und bestimmten Win32-APIs vorhanden, die sie erfordern.

Important

Zuordnungs- und Deallocation-Funktionen immer richtig koppeln. Der zugewiesene HeapAlloc Arbeitsspeicher muss HeapFree mit - nicht free() oder LocalFree. Das Mischen von Zuordnungs-/Deallocation-Familien führt zu Heapbeschädigungen, die schwer zu diagnostizieren sind.

Note

VirtualAlloc vs HeapAlloc: VirtualAlloc arbeitet auf Seiten granularität (mindestens 4 KB, Reservierungen ausgerichtet auf SYSTEM_INFO.dwAllocationGranularity, in der Regel 64 KB). Durch das Zuordnen vieler kleiner Objekte mit VirtualAlloc wird der Adressraum verschwendet. Verwenden Sie HeapAlloc (oder malloc/new) für kleine, häufige Zuordnungen. Verwenden Sie VirtualAlloc, wenn Sie große Adressbereiche reservieren, den Seitenschutz steuern oder benutzerdefinierte Zuweisungen implementieren müssen.

Ausführlicher Vergleich

Es folgt ein kurzer Vergleich der verschiedenen Speicherzuweisungsmethoden:

Obwohl die Funktionen "GlobalAlloc", " LocalAlloc" und "HeapAlloc " letztendlich Speicher aus demselben Heap zuordnen, bietet jeder eine etwas andere Funktionalität. Beispielsweise kann HeapAlloc angewiesen werden, eine Ausnahme auszuheben, wenn der Arbeitsspeicher nicht zugeordnet werden konnte, eine Funktion, die mit LocalAlloc nicht verfügbar ist. LocalAlloc unterstützt die Zuordnung von Handles, die das Verschieben des zugrunde liegenden Speichers durch eine Umlastung ermöglichen, ohne den Handlewert zu ändern, eine Funktion, die mit HeapAlloc nicht verfügbar ist.

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

Da die verschiedenen Heap-Allokatoren mit unterschiedlichen Mechanismen unterschiedliche Funktionen bieten, müssen Sie Arbeitsspeicher mit der richtigen Funktion freigeben. Der mit HeapAlloc zugewiesene Speicher muss z. B. mit HeapFree und nicht mit LocalFree oder GlobalFree freigegeben werden. Der mit GlobalAlloc oder LocalAlloc zugewiesene Speicher 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 Speicherzuweisung angeben. Die 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, dass die 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. Es ist auch die einzige Möglichkeit, Speicher in einer COM-basierten Anwendung freizugeben, da MIDL CoTaskMemAlloc und CoTaskMemFree zum Marshallen des Speichers verwendet.

Examples

Globale und lokale Funktionen

Heap-Funktionen

Virtuelle Speicherfunktionen