<allocators>

Определяются несколько шаблонов, упрощающих выделение и освобождение блоков памяти для контейнеров на основе узлов.

Синтаксис

#include <allocators>

Примечание.

<Распределители устарели> , начиная с Visual Studio 2019 версии 16.3.

Замечания

Заголовок <распределителей предоставляет шесть шаблонов распределителей> , которые можно использовать для выбора стратегий управления памятью для контейнеров на основе узлов. Для использования с этими шаблонами он также предоставляет несколько разных фильтров синхронизации, позволяющих настроить стратегию управления памятью во множестве разных многопоточных схем (включая отсутствие). Вы можете ускорить приложение или уменьшить требования к памяти, совпав стратегию управления памятью с шаблонами использования памяти и требованиями к синхронизации.

Шаблоны распределителя реализуются с многократно используемыми компонентами, которые можно настраивать или заменять, чтобы обеспечить дополнительные стратегии управления памятью.

Контейнеры на основе узлов в стандартной библиотеке C++ (std::list, std::set, std::multiset, std::map и std::multimap) хранят их элементы в отдельных узлах. Все узлы для конкретного типа контейнера имеют одинаковый размер, поэтому не требуется гибкость диспетчера памяти общего назначения. Так как размер каждого блока памяти становится известен во время компиляции, диспетчер памяти может быть гораздо проще и быстрее.

При использовании с контейнерами, которые не основаны на узлах (например, контейнеры стандартной библиотеки C++std::vector std::d eque и std::basic_string), шаблоны распределителя будут работать правильно, но, скорее всего, не обеспечивают никаких улучшений производительности по умолчанию.

Распределитель — это шаблон класса, описывающий объект, который управляет выделением хранилища и освобождением объектов и массивов объектов определенного типа. Объекты распределителя используются несколькими шаблонами классов контейнеров в стандартной библиотеке C++.

Распределители представляют собой шаблоны типа

template<class Type>
class allocator;

где аргумент шаблона Type — это тип, управляемый экземпляром распределителя. Стандартная библиотека C++ предоставляет распределитель по умолчанию, шаблон шаблона класса, определенный в <памяти>. Заголовок <распределителей предоставляет следующие распределители> :

При создании контейнера используйте соответствующий экземпляр распределителя как второй аргумент типа, как показано в следующем примере кода.

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

_List0 выделяет узлы с allocator_chunklist и фильтром синхронизации по умолчанию.

Используйте макрос ALLOCATOR_DECL для создания шаблонов распределителя с фильтрами синхронизации, отличными от установленных по умолчанию:

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

_Lst1 выделяет узлы с allocator_chunklist и фильтр синхронизации sync_per_thread.

Распределитель блоков — это кэш или фильтр. Кэш — это шаблон класса, который принимает один аргумент типа std::size_t. Он определяет распределитель блоков, который выделяет и освобождает блоки памяти одного размера. Он должен получать память с помощью оператора new, но отдельный вызов оператора new для каждого блока выполнять не требуется. Он может, например, дополнительно выделить память из блока большего размера или кэша освобожденных блоков для последующего перераспределения.

При использовании компилятора, который не может повторно привязать значение аргумента std:::size_t, используемого при создании шаблона, не обязательно значение аргумента _Sz передано функциям-членам кэша, выделенным и освобожденным.

<Распределители> предоставляют следующие шаблоны кэша:

Фильтр — это блок-распределитель, реализующий свои функции-члены с помощью другого блок-распределителя, который передается в него в качестве аргумента шаблона. Наиболее распространенная форма фильтра — это фильтр синхронизации, который применяет политику синхронизации для управления доступом к функциям-членам экземпляра другого распределителя блоков. <Распределители> предоставляют следующие фильтры синхронизации:

<Распределители> также предоставляют фильтр rts_alloc, который содержит несколько экземпляров распределителя блоков и определяет, какой экземпляр следует использовать для выделения или распределения сделки во время компиляции, а не во время компиляции. Он используется с компиляторами, которые не могут скомпилировать повторную привязку.

Политика синхронизации определяет, как экземпляр распределителя обрабатывает одновременные запросы на выделение и освобождение из нескольких потоков. Самая простая политика заключается в том, что все запросы передаются напрямую в базовый объект кэша, оставляя управление синхронизацией пользователю. Более сложная политика может заключаться в использовании мьютекса для сериализации доступа к базовому объекту кэша.

Если компилятор поддерживает компиляцию как однопоточных, так и многопоточных приложений, фильтр синхронизации по умолчанию для однопоточных приложений — sync_none; для всех остальных случаев — это sync_shared.

Шаблон cache_freelist кэша принимает аргумент максимального класса, который определяет максимальное количество элементов, хранящихся в свободном списке.

<Распределители предоставляют следующие максимальные классы> :

Макросы

Макрос Description
ALLOCATOR_DECL Возвращает шаблон класса распределителя.
CACHE_CHUNKLIST Создает stdext::allocators::cache_chunklist<sizeof(Type)>.
CACHE_FREELIST Создает stdext::allocators::cache_freelist<sizeof(Type), max>.
CACHE_SUBALLOC Создает stdext::allocators::cache_suballoc<sizeof(Type)>.
SYNC_DEFAULT Создает фильтр синхронизации.

Операторы

Operator Description
operator!= (<распределители>) Проверяет на неравенство между объектами распределителя указанного класса.
operator== (<распределители>) Проверяет на равенство объекты распределителя указанного класса.

Классы

Класс Description
allocator_base Определяет базовый класс и общие функции, необходимые для создания определяемого пользователем распределителя из фильтра синхронизации.
allocator_chunklist Описывает объект, который управляет выделением и освобождением памяти для объектов, использующих кэш типа cache_chunklist.
allocator_fixed_size Описывает объект, который управляет выделением и освобождением памяти для объектов типа Type, использующих кэш типа cache_freelist с длиной, управляемой классом max_fixed_size.
allocator_newdel Реализует распределитель, использующий удаление оператора для освобождения блока памяти и оператора, нового для выделения блока памяти.
allocator_suballoc Описывает объект, который управляет выделением и освобождением памяти для объектов типа Type, использующих кэш типа cache_suballoc.
allocator_unbounded Описывает объект, который управляет выделением и освобождением памяти для объектов типа Type, использующих кэш типа cache_freelist с длиной, управляемой классом max_unbounded.
allocator_variable_size Описывает объект, который управляет выделением и освобождением памяти для объектов типа Type, использующих кэш типа cache_freelist с длиной, управляемой классом max_variable_size.
cache_chunklist Задает распределитель блоков, который выделяет и освобождает блоки памяти одного размера.
cache_freelist Задает распределитель блоков, который выделяет и освобождает блоки памяти одного размера.
cache_suballoc Задает распределитель блоков, который выделяет и освобождает блоки памяти одного размера.
freelist Управляет списком блоков памяти.
max_fixed_size Описывает объект класса max, который ограничивает максимальную длину объекта freelist определенным значением.
max_none Описывает объект класса max, который ограничивает максимальную длину объекта freelist нулем.
max_unbounded Описывает объект класса max, который не ограничивает максимальную длину объекта freelist.
max_variable_size Описывает объект класса max, который ограничивает максимальную длину объекта freelist значением, приблизительно пропорциональным количеству выделенных блоков памяти.
rts_alloc Шаблон класса rts_alloc описывает фильтр , содержащий массив экземпляров кэша, и определяет, какой экземпляр будет использоваться для выделения и распределения сделки во время компиляции вместо времени компиляции.
sync_none Описывает фильтр синхронизации, который не предоставляет синхронизацию.
sync_per_container Описывает фильтр синхронизации, предоставляющий отдельный объект кэша для каждого объекта распределителя.
sync_per_thread Описывает фильтр синхронизации, предоставляющий отдельный объект кэширования для каждого потока.
sync_shared Описывает фильтр синхронизации, использующий мьютекс для управления доступом к объекту кэша, который является общим для всех распределителей.

Требования

Заголовок:<распределители>

Пространство имен: stdext

См. также

Справочник по файлам заголовков