std:: scoped_allocator_adaptor
|
Definido en el encabezado
<scoped_allocator>
|
||
|
template
<
class
OuterAlloc,
class
...
InnerAllocs
>
class
scoped_allocator_adaptor
|
(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
|
|
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
|
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
|
(C++11)
|
proporciona información sobre tipos de allocator
(plantilla de clase) |
|
(C++11)
|
verifica si el tipo especificado soporta construcción uses-allocator
(plantilla de clase) |
|
el allocator por defecto
(plantilla de clase) |