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)
Definido en el encabezado <scoped_allocator>
template < class OuterAlloc, class ... InnerAllocs >

class scoped_allocator_adaptor

: public OuterAlloc ;
(desde C++11)

La clase plantilla std::scoped_allocator_adaptor es un allocator que puede utilizarse con contenedores multinivel (vector de sets de listas de tuplas de maps, etc). Se instancia con un tipo de allocator externo OuterAlloc y cero o más tipos de allocator internos InnerAlloc... . Un contenedor construido directamente con un scoped_allocator_adaptor utiliza OuterAlloc para asignar sus elementos, pero si un elemento es a su vez un contenedor, utiliza el primer allocator interno. Los elementos de ese contenedor, si son a su vez contenedores, utilizan el segundo allocator interno, etc. Si hay más niveles en el contenedor que allocators internos, el último allocator interno se reutiliza para todos los contenedores anidados posteriores.

El propósito de este adaptador es inicializar correctamente los asignadores con estado en contenedores anidados, como cuando todos los niveles de un contenedor anidado deben ubicarse en el mismo segmento de memoria compartida. El constructor del adaptador toma los argumentos para todos los asignadores en la lista, y cada contenedor anidado obtiene el estado de su asignador del adaptador según sea necesario.

Para el propósito de scoped_allocator_adaptor , si el siguiente asignador interno es A , cualquier clase T para la cual std:: uses_allocator < T,A > :: value == true participa en la recursión como si fuera un contenedor. Adicionalmente, std::pair es tratado como tal contenedor mediante sobrecargas específicas de scoped_allocator_adaptor::construct .

La implementación típica mantiene una instancia de un std::scoped_allocator_adaptor<InnerAllocs...> como objeto miembro.

Tenga en cuenta que std::pmr::polymorphic_allocator s se propagan a contenedores anidados siguiendo uses-allocator construction y no necesitan (y no funcionan con) std::scoped_allocator_adaptor .

Contenidos

Tipos anidados

Tipo Definición
outer_allocator_type OuterAlloc
inner_allocator_type
  • scoped_allocator_adaptor < OuterAlloc > si sizeof... ( InnerAllocs ) es cero
  • scoped_allocator_adaptor < InnerAllocs... > en caso contrario
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


Dado el conjunto de OuterAlloc y InnerAlloc... como Allocs :

Tipo Definición
propagate_on_container_copy_assignment
propagate_on_container_move_assignment
propagate_on_container_swap
is_always_equal

Funciones miembro

crea un nuevo objeto scoped_allocator_adaptor
(función miembro pública)
destruye un objeto scoped_allocator_adaptor
(función miembro pública)
asigna un scoped_allocator_adaptor
(función miembro pública)
obtiene una referencia al inner_allocator
(función miembro pública)
obtiene una referencia al outer_allocator
(función miembro pública)
asigna almacenamiento sin inicializar usando el asignador externo
(función miembro pública)
desasigna almacenamiento usando el asignador externo
(función miembro pública)
devuelve el tamaño de asignación máximo soportado por el asignador externo
(función miembro pública)
construye un objeto en almacenamiento asignado, pasando el asignador interno a su constructor si es apropiado
(función miembro pública)
destruye un objeto en almacenamiento asignado
(función miembro pública)
copia el estado de scoped_allocator_adaptor y todos sus asignadores
(función miembro pública)
Plantillas de función solo para exposición
obtiene el asignador más externo
( función miembro solo para exposición* )
construye un objeto usando el asignador más externo
( función miembro solo para exposición* )
destruye un objeto usando el asignador más externo
( función miembro solo para exposición* )

Funciones no miembro

(eliminado en C++20)
compara dos objetos scoped_allocator_adaptor
(plantilla de función)

Guías de deducción (desde C++17)

Clases anidadas

Clase Definición
rebind template < class T >

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

Ejemplo

#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);
    // crear vector de vectores en memoria compartida
    ipc_matrix v(s.get_segment_manager());
    // para todas estas adiciones, los vectores internos obtienen sus argumentos de asignador
    // del scoped_allocator_adaptor del vector externo
    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");
}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2108 C++11 no había forma de mostrar si scoped_allocator_adaptor es sin estado se proporcionó is_always_equal

Véase también

proporciona información sobre tipos de allocator
(plantilla de clase)
verifica si el tipo especificado soporta construcción uses-allocator
(plantilla de clase)
el allocator por defecto
(plantilla de clase)