<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