Udostępnij za pośrednictwem


<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

Zobacz też

Odwołanie do plików nagłówka