std:: scoped_allocator_adaptor
|
Определено в заголовочном файле
<scoped_allocator>
|
||
|
template
<
class
OuterAlloc,
class
...
InnerAllocs
>
class
scoped_allocator_adaptor
|
(начиная с 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
|
|
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
|
Пример
#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
|
Смотрите также
|
(C++11)
|
предоставляет информацию о типах аллокаторов
(шаблон класса) |
|
(C++11)
|
проверяет, поддерживает ли указанный тип конструкцию с использованием аллокатора
(шаблон класса) |
|
аллокатор по умолчанию
(шаблон класса) |