Share via


<allocators>

Definiert mehrere Vorlagen, die dabei helfen, Speicherblöcke für knotenbasierte Container zuzuweisen und freizugeben.

Syntax

#include <allocators>

Hinweis

<Allocators> sind veraltet, beginnend mit Visual Studio 2019, Version 16.3.

Hinweise

Der <Allocators-Header> stellt sechs Allocatorvorlagen bereit, mit denen Speicherverwaltungsstrategien für knotenbasierte Container ausgewählt werden können. Für den Gebrauch mit diesen Vorlagen stellt es außerdem mehrere verschiedene Synchronisierungsfilter bereit, mit deren Hilfe Sie Strategien zur Speicherverwaltung an eine Vielzahl von Multithread-Schemas (oder auch an kein Schema) anpassen können. Sie können Ihre App beschleunigen oder die Speicheranforderungen verringern, indem Sie eine Speicherverwaltungsstrategie mit ihren Speichernutzungsmustern und Synchronisierungsanforderungen abgleichen.

Allocatorvorlagen werden mit wiederverwendbaren Komponenten implementiert, die angepasst oder ersetzt werden können, um weitere Strategien zur Speicherverwaltung bereitzustellen.

Die knotenbasierten Container in der C++-Standardbibliothek (std::list, std::set, std::multiset, std::map und std::multimap) speichern ihre Elemente in einzelnen Knoten. Alle Knoten für einen bestimmten Containertyp sind gleich groß, weshalb die Flexibilität eines allgemeinen Speicher-Managers nicht erforderlich ist. Weil die Größe jedes Speicherblocks beim Kompilierzeitpunkt bekannt ist, ist der Speicher-Manager sehr viel einfacher und schneller.

Bei Verwendung mit Containern, die nicht knotenbasiert sind (z. B. die C++-Standardbibliothekscontainer std::vector std::d eque und std::basic_string), funktionieren die Allocatorvorlagen ordnungsgemäß, bieten jedoch keine Leistungsverbesserungen gegenüber dem Standardverknöpfer.

Ein Allocator ist eine Klassenvorlage, die ein Objekt beschreibt, das die Speicherzuweisung verwaltet und für Objekte und Arrays von Objekten eines bestimmten Typs freigibt. Allocator-Objekte werden von mehreren Containerklassenvorlagen in der C++-Standardbibliothek verwendet.

Allocators sind alle Vorlagen folgenden Typs:

template<class Type>
class allocator;

in denen das Vorlagenargument Type der von der Allocatorinstanz verwaltete Typ ist. Die C++-Standardbibliothek stellt einen Standardverknöpfer, Klassenvorlagen-Allocator bereit, der im< Arbeitsspeicher> definiert ist. Der <Allocators-Header> stellt die folgenden Allocators bereit:

Verwenden Sie eine passende Istanziierung eines Allocators als zweiten Typargument, während Sie einen Container erstellen, wie z.B. in folgendem Beispiel.

#include <list>
#include <allocators>
std::list<int, stdext::allocators::allocator_chunklist<int> > _List0;

„_List0“ weist Knoten mit allocator_chunklist und dem standardmäßigen Synchronisierungsfilter zu.

Verwenden Sie das Makro ALLOCATOR_DECL, wenn Sie Allocatorvorlagen mit anderen als den standardmäßigen Synchronisierungsfiltern erstellen wollen:

#include <list>
#include <allocators>
ALLOCATOR_DECL(CACHE_CHUNKLIST, stdext::allocators::sync_per_thread, Alloc);
std::list<int, alloc<int> > _List1;

„_Lst1“ weist Knoten mit allocator_chunklist und dem Synchronisierungsfilter sync_per_thread zu.

Eine Blockzuweisung ist ein Cache oder ein Filter. Ein Cache ist eine Klassenvorlage, die ein Argument vom Typ "std::size_t" verwendet. Er definiert eine Blockzuweisung, die Speicherblöcke einheitlicher Größe zuweist und freigibt. Er muss mithilfe des Operators new Arbeitsspeicher erhalten; er darf jedoch nicht für jeden Block den Operator new separat aufrufen. Möglicherweise stellt er Unterzuordnungen aus einem größeren Block her, oder er zwischenspeichert möglicherweise freigegebene Blöcke für eine darauffolgende Freigabe.

Bei einem Compiler, der den Wert des Arguments "std::size_t" nicht neu binden kann, das beim Instanziieren der Vorlage verwendet wird, ist nicht notwendigerweise der Wert des Arguments, _Sz an die Memberfunktionen eines Caches übergeben werden, zuweisen und deallocate.

<Allocators> stellen die folgenden Cachevorlagen bereit:

Ein Filter ist ein Block-Allocator, der seine Memberfunktionen mithilfe eines anderen Block-Allocators implementiert, der als Vorlagenargument an ihn übergeben wird. Synchronisierungsfilter sind die häufigste Filterform, die eine Synchronisierungsrichtlinie anwenden, um den Zugriff auf die Memberfunktionen einer Instanz eines anderen Blockallocators zu steuern. <Allocators> stellen die folgenden Synchronisierungsfilter bereit:

<Allocators> stellt auch den Filter rts_alloc bereit, der mehrere Blockverteilerinstanzen enthält und bestimmt, welche Instanz zur Laufzeit anstelle der Kompilierungszeit für die Zuordnung oder Deallocation verwendet werden soll. Sie wird mit Compilern verwendet, die keine Neubindungen kompilieren können.

Eine Synchronisierungsrichtlinie legt fest, wie Allocatorinstanzen gleichzeitige Belegungs- und Freigabeanforderungen aus verschiedenen Threads verarbeiten. Die einfachste Richtlinie ist, alle Anforderungen direkt an das zugrundeliegende Cacheobjekt zu übergeben; die Synchronisierungsverwaltung wird dem Nutzer überlassen. Eine komplexere Richtlinie wäre z.B. das Verwenden eines Mutex zur Serialisierung des Zugriffs auf den zugrundeliegenden Cache.

Wenn ein Compiler das Kompilieren sowohl von Singlethread- als auch von Multithread-Anwendungen unterstützt, ist der standardmäßige Synchronisierungsfilter für Singlethread-Anwendung sync_none; andernfalls ist er sync_shared.

Die Cachevorlage cache_freelist verwendet ein maximales Klassenargument, das die maximale Anzahl von Elementen bestimmt, die in der kostenlosen Liste gespeichert werden sollen.

<Allocators> stellt die folgenden max. Klassen bereit:

Makros

Makro Beschreibung
ALLOCATOR_DECL Gibt eine Allocator-Klassenvorlage zurück.
CACHE_CHUNKLIST Gibt stdext::allocators::cache_chunklist<sizeof(Type)> aus.
CACHE_FREELIST Gibt stdext::allocators::cache_freelist<sizeof(Type), max> aus.
CACHE_SUBALLOC Gibt stdext::allocators::cache_suballoc<sizeof(Type)> aus.
SYNC_DEFAULT Gibt einen Synchronisierungsfilter aus.

Operatoren

Operator Beschreibung
operator!= (<Allocators>) Es wird auf Ungleichheit zwischen Zuweisungsobjekten einer bestimmten Klasse getestet.
operator== (<Allocators>) Es wird auf Gleichheit zwischen Zuweisungsobjekten einer bestimmten Klasse getestet.

Klassen

Klasse Beschreibung
allocator_base Definiert die Basisklasse und allgemeine Funktionen, die zum Erstellen einer benutzerdefinierten Zuweisung von einem Synchronisierungsfilter erforderlich sind.
allocator_chunklist Beschreibt ein Objekt, das die Speicherbelegung und -freigabe für Objekte, die einen Zwischenspeicher des Typs cache_chunklist verwenden.
allocator_fixed_size Beschreibt ein Objekt, das die Speicherbelegung und -freigabe für Objekte des Typs Type verwaltet, die einen Cache des Typs cache_freelist mit einer von max_fixed_size verwalteten Länge verwenden.
allocator_newdel Implementiert einen Allocator, der die Operatorlöschung verwendet, um einen Speicherblock und einen neuen Operator zuzuordnen, um einen Speicherblock zuzuweisen.
allocator_suballoc Beschreibt ein Objekt, das die Speicherbelegung und -freigabe für Objekte des Typs Type verwaltet, die einen Cache des Typs cache_suballoc verwenden.
allocator_unbounded Beschreibt ein Objekt, das die Speicherbelegung und -freigabe für Objekte des Typs Type verwaltet, die einen Cache des Typs cache_freelist mit einer von max_unbound verwalteten Länge verwenden.
allocator_variable_size Beschreibt ein Objekt, das die Speicherbelegung und -freigabe für Objekte des Typs Type verwaltet, die einen Cache des Typs cache_freelist mit einer von max_variable_size verwalteten Länge verwenden.
cache_chunklist Definiert eine Blockzuweisung, die Speicherblöcke einheitlicher Größe zuweist und freigibt.
cache_freelist Definiert eine Blockzuweisung, die Speicherblöcke einheitlicher Größe zuweist und freigibt.
cache_suballoc Definiert eine Blockzuweisung, die Speicherblöcke einheitlicher Größe zuweist und freigibt.
freelist Verwaltet eine Liste von Speicherblöcken.
max_fixed_size Beschreibt ein Objekt der max-Klasse, das ein freelist-Objekt auf eine maximale Länge begrenzt.
max_none Beschreibt ein Objekt der max-Klasse, das ein freelist-Objekt auf eine maximale Länge von null begrenzt.
max_unbounded Beschreibt ein Objekt der max-Klasse, das die maximale Länge eines freelist-Objekts nicht einschränkt.
max_variable_size Beschreibt ein Objekt der max-Klasse, das die maximale Länge eines freelist-Objekts auf eine maximale Länge einschränkt, die annähernd proportional zur Anzahl von zugewiesenen Speicherblöcken ist.
rts_alloc Die rts_alloc Klassenvorlage beschreibt einen Filter , der ein Array von Cacheinstanzen enthält und bestimmt, welche Instanz zur Laufzeit anstelle der Kompilierungszeit für die Zuordnung und den Deallocation verwendet werden soll.
sync_none Beschreibt einen Synchronisierungsfilter, der keine Synchronisierung bietet.
sync_per_container Beschreibt einen Synchronisierungsfilter, der für jedes Zuweisungsobjekt ein getrenntes Cache-Objekt bereitstellt.
sync_per_thread Beschreibt einen Synchronisierungsfilter, der für jeden Thread ein getrenntes Cache-Objekt bereitstellt.
sync_shared Beschreibt einen Synchronisierungsfilter, in dem ein Mutex verwendet wird, um den Zugriff auf ein Cache-Objekt zu steuern, das von allen Zuweisungen (allocator-Objekten) gemeinsam verwendet wird.

Anforderungen

Header:<allocators>

Namespace: stdext

Siehe auch

Headerdateienreferenz