Namespaces
Variants

std:: scoped_allocator_adaptor

From cppreference.net
Memory management library
( exposition only* )
Allocators
scoped_allocator_adaptor
(C++11)
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовочном файле <scoped_allocator>
template < class OuterAlloc, class ... InnerAllocs >

class scoped_allocator_adaptor

: public OuterAlloc ;
(начиная с C++11)

Класс-шаблон std::scoped_allocator_adaptor представляет собой аллокатор, который может использоваться с многоуровневыми контейнерами (вектор наборов списков кортежей отображений и т.д.). Он инстанцируется с одним внешним типом аллокатора OuterAlloc и нулем или более внутренними типами аллокаторов InnerAlloc... . Контейнер, созданный напрямую с помощью scoped_allocator_adaptor , использует OuterAlloc для выделения памяти под свои элементы, но если элемент сам является контейнером, он использует первый внутренний аллокатор. Элементы этого контейнера, если они сами являются контейнерами, используют второй внутренний аллокатор и т.д. Если уровней вложенности контейнера больше, чем внутренних аллокаторов, последний внутренний аллокатор повторно используется для всех дальнейших вложенных контейнеров.

Цель этого адаптера - корректно инициализировать аллокаторы с состоянием во вложенных контейнерах, например, когда все уровни вложенного контейнера должны быть размещены в одном сегменте разделяемой памяти. Конструктор адаптера принимает аргументы для всех аллокаторов в списке, и каждый вложенный контейнер получает состояние своего аллокатора от адаптера по мере необходимости.

Для целей scoped_allocator_adaptor , если следующий внутренний аллокатор — A , любой класс T , для которого std:: uses_allocator < T,A > :: value == true участвует в рекурсии, как если бы он был контейнером. Дополнительно, std::pair рассматривается как такой контейнер специальными перегрузками scoped_allocator_adaptor::construct .

Типичная реализация содержит экземпляр std::scoped_allocator_adaptor<InnerAllocs...> в качестве объекта-члена.

Обратите внимание, что std::pmr::polymorphic_allocator s передаются во вложенные контейнеры в соответствии с uses-allocator construction и не требуют (и не работают с) std::scoped_allocator_adaptor .

Содержание

Вложенные типы

Тип Определение
outer_allocator_type OuterAlloc
inner_allocator_type
  • scoped_allocator_adaptor < OuterAlloc > если sizeof... ( InnerAllocs ) равен нулю
  • scoped_allocator_adaptor < InnerAllocs... > в противном случае
value_type std:: allocator_traits < OuterAlloc > :: value_type
size_type std:: allocator_traits < OuterAlloc > :: size_type
difference_type std:: allocator_traits < OuterAlloc > :: difference_type
pointer std:: allocator_traits < OuterAlloc > :: pointer
const_pointer std:: allocator_traits < OuterAlloc > :: const_pointer
void_pointer std:: allocator_traits < OuterAlloc > :: void_pointer
const_void_pointer std:: allocator_traits < OuterAlloc > :: const_void_pointer


Дано множество OuterAlloc и InnerAlloc... как Allocs :

Тип Определение
propagate_on_container_copy_assignment
propagate_on_container_move_assignment
propagate_on_container_swap
is_always_equal

Функции-члены

создает новый объект scoped_allocator_adaptor
(публичная функция-член)
уничтожает объект scoped_allocator_adaptor
(публичная функция-член)
присваивает scoped_allocator_adaptor
(публичная функция-член)
получает ссылку на inner_allocator
(публичная функция-член)
получает ссылку на outer_allocator
(публичная функция-член)
выделяет неинициализированную память с использованием внешнего аллокатора
(публичная функция-член)
освобождает память с использованием внешнего аллокатора
(публичная функция-член)
возвращает максимальный размер выделения, поддерживаемый внешним аллокатором
(публичная функция-член)
создает объект в выделенной памяти, передавая внутренний аллокатор его конструктору, если это уместно
(публичная функция-член)
уничтожает объект в выделенной памяти
(публичная функция-член)
копирует состояние scoped_allocator_adaptor и всех его аллокаторов
(публичная функция-член)
Шаблоны функций только для демонстрации
получает самый внешний аллокатор
( функция-член только для демонстрации* )
создает объект с использованием самого внешнего аллокатора
( функция-член только для демонстрации* )
уничтожает объект с использованием самого внешнего аллокатора
( функция-член только для демонстрации* )

Функции, не являющиеся членами класса

(удалено в C++20)
сравнивает два объекта scoped_allocator_adaptor
(шаблон функции)

Руководства по выводу (начиная с C++17)

Вложенные классы

Класс Определение
rebind template < class T >

struct rebind
{
using other = scoped_allocator_adaptor
< std:: allocator_traits < OuterAlloc > :: template rebind_alloc < T > ,
InnerAllocs... > ;
} ;

Пример

#include <boost/interprocess/allocators/adaptive_pool.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <scoped_allocator>
#include <vector>
namespace bi = boost::interprocess;
template<class T>
using alloc = bi::adaptive_pool<T, bi::managed_shared_memory::segment_manager>;
using ipc_row = std::vector<int, alloc<int>>;
using ipc_matrix = std::vector<ipc_row, std::scoped_allocator_adaptor<alloc<ipc_row>>>;
int main()
{
    bi::managed_shared_memory s(bi::create_only, "Demo", 65536);
    // создать вектор векторов в разделяемой памяти
    ipc_matrix v(s.get_segment_manager());
    // для всех этих добавлений внутренние векторы получают свои аргументы аллокатора
    // из scoped_allocator_adaptor внешнего вектора
    v.resize(1);
    v[0].push_back(1);
    v.emplace_back(2);
    std::vector<int> local_row = {1, 2, 3};
    v.emplace_back(local_row.begin(), local_row.end());
    bi::shared_memory_object::remove("Demo");
}

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2108 C++11 не было возможности показать, является ли scoped_allocator_adaptor бессостоятельным предоставлен is_always_equal

Смотрите также

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