<allocators>
Definiuje kilka szablonów, które ułatwiają przydzielanie i zwalnianie bloków pamięci dla kontenerów opartych na węzłach.
Składnia
#include <allocators>
Uwaga
<Alokatory> są przestarzałe, począwszy od programu Visual Studio 2019 w wersji 16.3.
Uwagi
<Nagłówek alokatorów> zawiera sześć szablonów alokatora, których można użyć do wybierania strategii zarządzania pamięcią dla kontenerów opartych na węzłach. Do użycia z tymi szablonami udostępnia również kilka różnych filtrów synchronizacji, aby dostosować strategię zarządzania pamięcią do różnych schematów wielowątkowych (w tym brak). Możesz przyspieszyć działanie aplikacji lub zmniejszyć jej wymagania dotyczące pamięci, pasując do strategii zarządzania pamięcią do wzorców użycia pamięci i wymagań dotyczących synchronizacji.
Szablony alokatora są implementowane przy użyciu składników wielokrotnego użytku, które można dostosować lub zastąpić, aby zapewnić dodatkowe strategie zarządzania pamięcią.
Kontenery oparte na węzłach w standardowej bibliotece C++ (std::list, std::set, std::multiset, std::map i std::multimap) przechowują swoje elementy w poszczególnych węzłach. Wszystkie węzły dla określonego typu kontenera mają taki sam rozmiar, więc elastyczność menedżera pamięci ogólnego przeznaczenia nie jest wymagana. Ponieważ rozmiar każdego bloku pamięci jest znany w czasie kompilacji, menedżer pamięci może być znacznie prostszy i szybszy.
W przypadku używania z kontenerami, które nie są oparte na węźle (na przykład kontenery biblioteki standardowej C++ std::vector std::d eque i std::basic_string), szablony alokatora będą działać poprawnie, ale prawdopodobnie nie zapewnią żadnej poprawy wydajności względem domyślnego alokatora.
Alokator to szablon klasy opisujący obiekt, który zarządza alokacją magazynu i zwalnia obiekty i tablice obiektów wyznaczonego typu. Obiekty alokatora są używane przez kilka szablonów klas kontenerów w standardowej bibliotece C++.
Alokatory to wszystkie szablony tego typu:
template<class Type>
class allocator;
gdzie argument Type
szablonu jest typem zarządzanym przez wystąpienie alokatora. Biblioteka Standardowa języka C++ udostępnia domyślny alokator, alokator szablonów klas, który jest zdefiniowany w <pamięci>. <Nagłówek alokatorów> zawiera następujące alokatory:
Użyj odpowiedniego wystąpienia alokatora jako drugiego argumentu typu podczas tworzenia kontenera, takiego jak poniższy przykład kodu.
#include <list>
#include <allocators>
std::list<int, stdext::allocators::allocator_chunklist<int> > _List0;
_List0 przydziela węzły i allocator_chunklist
domyślny filtr synchronizacji.
Użyj ALLOCATOR_DECL makra, aby utworzyć szablony alokatora z filtrami synchronizacji innymi niż domyślne:
#include <list>
#include <allocators>
ALLOCATOR_DECL(CACHE_CHUNKLIST, stdext::allocators::sync_per_thread, Alloc);
std::list<int, alloc<int> > _List1;
_Lst1 przydziela węzły i allocator_chunklist
filtr synchronizacji sync_per_thread .
Alokator bloków to pamięć podręczna lub filtr. Pamięć podręczna to szablon klasy, który przyjmuje jeden argument typu std::size_t. Definiuje alokator bloków, który przydziela i cofa przydział bloków pamięci o pojedynczym rozmiarze. Musi uzyskać pamięć przy użyciu operatora new
, ale nie musi wykonywać oddzielnego wywołania operatora new
dla każdego bloku. Na przykład przydział podrzędny z większego bloku lub bloków cofania przydziału pamięci podręcznej do kolejnej lokalizacji.
W przypadku kompilatora, który nie może ponownie połączyć wartości argumentu std::size_t używanego, gdy utworzono wystąpienie szablonu, nie musi być wartością argumentu, _Sz przekazaną do funkcji członkowskich pamięci podręcznej przydzielenia i cofnięcia przydziału.
<Alokatory udostępnia następujące szablony> pamięci podręcznej:
Filtr to alokator bloków, który implementuje funkcje składowe przy użyciu innego alokatora bloków, który jest przekazywany do niego jako argument szablonu. Najbardziej typową formą filtru jest filtr synchronizacji, który stosuje zasady synchronizacji w celu kontrolowania dostępu do funkcji członkowskich wystąpienia innego alokatora bloków. <Alokatory> udostępnia następujące filtry synchronizacji:
<Alokatory> udostępnia również rts_alloc filtru, który przechowuje wiele wystąpień alokatora bloków i określa, które wystąpienie ma być używane do alokacji lub cofania przydziału w czasie wykonywania, a nie w czasie kompilacji. Jest on używany z kompilatorami, których nie można skompilować ponownie.
Zasady synchronizacji określają, w jaki sposób wystąpienie alokatora obsługuje równoczesne żądania alokacji i cofania przydziału z wielu wątków. Najprostszą zasadą jest przekazanie wszystkich żądań bezpośrednio do bazowego obiektu pamięci podręcznej, pozostawiając użytkownikowi zarządzanie synchronizacją. Bardziej złożone zasady mogą być używane przez mutex do serializacji dostępu do bazowego obiektu pamięci podręcznej.
Jeśli kompilator obsługuje kompilowanie zarówno jednowątkowych, jak i wielowątowych aplikacji, domyślny filtr synchronizacji dla aplikacji jednowątkowych to sync_none
; dla wszystkich innych przypadków jest to sync_shared
.
Szablon cache_freelist
pamięci podręcznej przyjmuje argument maksymalnej klasy, który określa maksymalną liczbę elementów, które mają być przechowywane na liście bezpłatnej.
<Alokatory> udostępnia następujące maksymalne klasy:
Makra
Makro | opis |
---|---|
ALLOCATOR_DECL | Zwraca szablon klasy alokatora. |
CACHE_CHUNKLIST | stdext::allocators::cache_chunklist<sizeof(Type)> Daje . |
CACHE_FREELIST | stdext::allocators::cache_freelist<sizeof(Type), max> Daje . |
CACHE_SUBALLOC | stdext::allocators::cache_suballoc<sizeof(Type)> Daje . |
SYNC_DEFAULT | Zwraca filtr synchronizacji. |
Operatory
Operator | opis |
---|---|
operator!= (<alokatory>) | Testuje pod kątem nierówności pomiędzy obiektami alokatora określonej klasy. |
operator== (<alokatory>) | Testuje pod kątem równości pomiędzy obiektami alokatora określonej klasy. |
Klasy
Klasa | opis |
---|---|
allocator_base | Definiuje klasę podstawową i typowe funkcje potrzebne do utworzenia alokatora zdefiniowanego przez użytkownika na podstawie filtru synchronizacji. |
allocator_chunklist | Opisuje obiekt, który zarządza alokacją magazynu i zwalnia obiekty przy użyciu pamięci podręcznej typu cache_chunklist. |
allocator_fixed_size | Opisuje obiekt, który zarządza alokacją magazynu i zwalnia obiekty typu przy użyciu pamięci podręcznej typu Type cache_freelist o długości zarządzanej przez max_fixed_size. |
allocator_newdel | Implementuje alokator, który używa operatora delete do cofnięcia przydziału bloku pamięci i operatora nowego w celu przydzielenia bloku pamięci. |
allocator_suballoc | Opisuje obiekt, który zarządza alokacją magazynu i zwalnia obiekty typu Type przy użyciu pamięci podręcznej typu cache_suballoc. |
allocator_unbounded | Opisuje obiekt, który zarządza alokacją magazynu i zwalnia obiekty typu przy użyciu pamięci podręcznej typu Type cache_freelist o długości zarządzanej przez max_unbounded. |
allocator_variable_size | Opisuje obiekt, który zarządza alokacją magazynu i zwalnia obiekty typu przy użyciu pamięci podręcznej typu Type cache_freelist o długości zarządzanej przez max_variable_size. |
cache_chunklist | Definiuje alokator bloków, który przydziela i cofa przydział bloków pamięci o pojedynczym rozmiarze. |
cache_freelist | Definiuje alokator bloków, który przydziela i cofa przydział bloków pamięci o pojedynczym rozmiarze. |
cache_suballoc | Definiuje alokator bloków, który przydziela i cofa przydział bloków pamięci o pojedynczym rozmiarze. |
lista bezpłatna | Zarządza listą bloków pamięci. |
max_fixed_size | Opisuje maksymalny obiekt klasy, który ogranicza obiekt freelist do stałej maksymalnej długości. |
max_none | Opisuje maksymalny obiekt klasy, który ogranicza obiekt freelist do maksymalnej długości zera. |
max_unbounded | Opisuje maksymalny obiekt klasy, który nie ogranicza maksymalnej długości obiektu freelist . |
max_variable_size | Opisuje maksymalny obiekt klasy, który ogranicza obiekt freelist do maksymalnej długości, która jest w przybliżeniu proporcjonalna do liczby przydzielonych bloków pamięci. |
rts_alloc | Szablon klasy rts_alloc opisuje filtr , który zawiera tablicę wystąpień pamięci podręcznej i określa, które wystąpienie ma być używane do alokacji i cofania alokacji w czasie wykonywania, a nie w czasie kompilacji. |
sync_none | Opisuje filtr synchronizacji, który nie zapewnia synchronizacji. |
sync_per_container | Opisuje filtr synchronizacji, który udostępnia oddzielny obiekt pamięci podręcznej dla każdego obiektu alokatora. |
sync_per_thread | Opisuje filtr synchronizacji, który udostępnia oddzielny obiekt pamięci podręcznej dla każdego wątku. |
sync_shared | Opisuje filtr synchronizacji, który używa mutex do kontrolowania dostępu do obiektu pamięci podręcznej, który jest współużytkowany przez wszystkie alokatory. |
Wymagania
Nagłówek:<alokatory>
Przestrzeń nazw: stdext