std::aligned_storage
Definido en el archivo de encabezado <type_traits> | ||
template<std::size_t Len, std::size_t Align =/* alineación-por-defecto*/> struct aligned_storage; | (desde C++11) | |
Proporciona el tipo anidado type
, que es un tipo trivial de diseño estándar adecuado para uso en almacenamiento sin inicializar por cualquier objeto cuyo tamaño sea como máximo Len
y cuyo requerimiento de alineación es un divisor de Align
.
El valor por defecto de Align
es el requerimiento de alineación más estricto (el más grande) para cualquier objeto cuyo tamaño sea como máximo Len
. Si no se usa el valor por defecto, Align
debe ser el valor de alignof(T) para algún tipo T
, o el comportamiento está indefinido.
El comportamiento está indefinido si Len ==0.
Está definido por la implementación si se soporta cualquier alineación extendida.
El comportamiento de un programa que añade especializaciones para aligned_storage
no está definido.
Contenido |
[editar]Tipos miembro
Nombre | Definición |
type | El tipo de datos simple (POD) de un tamaño como mínimo Len con requerimiento de alineación Align . |
[editar]Tipos auxiliares
template<std::size_t Len, std::size_t Align =/*alineación-por-defecto*/> using aligned_storage_t =typename aligned_storage<Len, Align>::type; | (desde C++14) | |
[editar]Notas
El tipo definido por std::aligned_storage<>::type
se puede utilizar para crear bloques de memoria no inicializados adecuados para contener los objetos de un tipo dado, opcionalmente alineados más estrictamente que su requerimiento de alineación natural, por ejemplo, en una caché o límite de página.
Al igual que con cualquier otro almacenamiento no inicializado, los objetos se crean usando new de ubicación y se destruyen con llamadas explícitas al destructor.
[editar]Posible implementación
Excepto para el argumento por defecto, aligned_storage
puede expresarse en términos de alignas
:
template<std::size_t Len, std::size_t Align /* alineación por defecto no implementada */>struct aligned_storage {struct type { alignas(Align)unsignedchar data[Len];};}; |
[editar]Ejemplo
Una clase vector primitiva estática, que demuestra la creación, acceso y destrucción de objetos en almacenamiento alineado
#include <iostream>#include <type_traits>#include <string> template<class T, std::size_t N>class static_vector {// almacenamiento sin inicializar alineado apropiadamente para las T de Ntypename std::aligned_storage<sizeof(T), alignof(T)>::type data[N];std::size_t m_size =0; public:// Crear un objeto en almacenamiento alineadotemplate<typename ...Args>void emplace_back(Args&&... args){if( m_size >= N )// posible control de erroresthrowstd::bad_alloc{}; // construir valor memoria de almacenamiento alineado// using inplace operator new new(&data[m_size]) T(std::forward<Args>(args)...);++m_size;} // Acceder a un objeto en almacenamiento alineadoconst T& operator[](std::size_t pos)const{// nota: necesita std::launder desde C++17return*reinterpret_cast<const T*>(&data[pos]);} // Borrar/eliminar objetos de almacenamiento alineado ~static_vector(){for(std::size_t pos =0; pos < m_size;++pos){// nota: necesita std::launder desde C++17reinterpret_cast<T*>(&data[pos])->~T();}}}; int main(){ static_vector<std::string, 10> v1; v1.emplace_back(5, '*'); v1.emplace_back(10, '*');std::cout<< v1[0]<<'\n'<< v1[1]<<'\n';}
Salida:
***** **********
[editar]Véase también
especificador alignas (C++11) | Especifica que el almacenamiento para la variable debe estar alineado por la cantidad específica |
(C++11) | Obtiene los requisitos de alineación del tipo (plantilla de clase) |
(C++11) | Define el tipo adecuado para su uso como almacenamiento sin inicializar para todos los tipos dados (plantilla de clase) |
(C++11) | Tipo de datos simple con requerimiento de alineación tan grande como cualquier otro tipo escalar. (typedef) |
(C++17) | Barrera de optimización de puntero. (plantilla de función) |