Spec-Zone.ru › C++

std::scoped_allocator_adaptor

Определён в заголовочном файле <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 распространяются на вложенные контейнеры согласно конструированию с использованием аллокатора и не требуют 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
  • std::true_type, если существует тип A в Allocs, такой что std::allocator_traits<A>::propagate_on_container_copy_assignment::value является true
  • std::false_type в противном случае
propagate_on_container_move_assignment
  • std::true_type, если существует тип A в Allocs, такой что std::allocator_traits<A>::propagate_on_container_move_assignment::value является true
  • std::false_type в противном случае
propagate_on_container_swap
  • std::true_type, если существует тип A в Allocs, такой что std::allocator_traits<A>::propagate_on_container_swap::value является true
  • std::false_type в противном случае
is_always_equal
  • std::true_type, если существует тип A в Allocs, такой что std::allocator_traits<A>::is_always_equal::value является true
  • std::false_type в противном случае

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

(конструктор)
создаёт новый объект scoped_allocator_adaptor
(открытая функция-член)
(деструктор)
уничтожает объект scoped_allocator_adaptor
(открытая функция-член)
operator=
присваивает значение scoped_allocator_adaptor
(открытая функция-член)
inner_allocator
получает ссылку на внутренний аллокатор inner_allocator
(открытая функция-член)
outer_allocator
получает ссылку на внешний аллокатор outer_allocator
(открытая функция-член)
allocate
выделяет неинициализированную память с помощью внешнего аллокатора
(открытая функция-член)
deallocate
освобождает память с помощью внешнего аллокатора
(открытая функция-член)
max_size
возвращает наибольший размер выделения памяти, поддерживаемый внешним аллокатором
(открытая функция-член)
construct
создаёт объект в выделенной памяти, при необходимости передавая внутренний аллокатор его конструктору
(открытая функция-член)
destroy
уничтожает объект в выделенной памяти
(открытая функция-член)
select_on_container_copy_construction
копирует состояние scoped_allocator_adaptor и всех его аллокаторов
(открытая функция-член)
Шаблоны функций, используемые только для описания
outermost
получает самый внешний аллокатор
(функция-член, используемая только для описания*)
outermost-construct
создаёт объект с помощью самого внешнего аллокатора
(функция-член, используемая только для описания*)
outermost-destroy
уничтожает объект с помощью самого внешнего аллокатора
(функция-член, используемая только для описания*)

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

operator==operator!=
(удалены в 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);
    
    // create vector of vectors in shared memory
    ipc_matrix v(s.get_segment_manager());
    
    // for all these additions, the inner vectors obtain their allocator arguments
    // from the outer vector's 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

См. также

allocator_traits
(C++11)
предоставляет сведения о типах аллокаторов
(шаблон класса)
uses_allocator
(C++11)
проверяет, поддерживает ли указанный тип конструирование с использованием аллокатора
(шаблон класса)
allocator
аллокатор по умолчанию
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/scoped_allocator_adaptor

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API