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<InnerAllocs...> или, если sizeof...(InnerAllocs) == 0, scoped_allocator_adaptor<OuterAlloc>
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
propagate_on_container_copy_assignment std::true_type если std::allocator_traits<A>::propagate_on_container_copy_assignment::value является true по крайней мере для одного распределителя A среди OuterAlloc и InnerAlloc...
propagate_on_container_move_assignment std::true_type если std::allocator_traits<A>::propagate_on_container_move_assignment::value является true по крайней мере для одного распределителя A среди OuterAlloc и InnerAlloc...
propagate_on_container_swap std::true_type если std::allocator_traits<A>::propagate_on_container_swap::value является true по крайней мере для одного распределителя A среди OuterAlloc и InnerAlloc...
is_always_equal std::true_type если std::allocator_traits<A>::is_always_equal::value является true для каждого распределителя A среди OuterAlloc и InnerAlloc...
rebind

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

Члены-функции

(конструктор)
создает новый экземпляр 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 и всех его распределителей
(публичная функция-член)

Функции вне класса

operator==operator!=
(удалено в C++20)
сравнивает два экземпляра scoped_allocator_adaptor
(шаблон функции)

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

Пример

#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/w/cpp/memory/scoped_allocator_adaptor

Spec-Zone.ru

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