Namespaces
Variants

std:: aligned_storage

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
aligned_storage
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Definido en el encabezado <type_traits>
template < std:: size_t Len, std:: size_t Align = /* default-alignment */ >
struct aligned_storage ;
(desde C++11)
(obsoleto en C++23)

Proporciona el tipo anidado type , que satisface TrivialType y StandardLayoutType y es adecuado para usar como almacenamiento no inicializado para cualquier objeto cuyo tamaño sea como máximo Len y cuyo requisito de alineación sea un divisor de Align .

El valor predeterminado de Align es el requisito de alineación más estricto (el mayor) para cualquier objeto cuyo tamaño sea como máximo Len . Si no se utiliza el valor predeterminado, Align debe ser el valor de alignof ( T ) para algún tipo T , o el comportamiento es indefinido.

El comportamiento es indefinido si Len == 0 .

Está definido por la implementación si se admite cualquier alineación extendida .

Si el programa añade especializaciones para std::aligned_storage , el comportamiento no está definido.

Contenidos

Tipos de miembros

Nombre Definición
type un tipo trivial y standard-layout de al menos tamaño Len con requisito de alineación Align

Tipos auxiliares

template < std:: size_t Len, std:: size_t Align = /* default-alignment */ >
using aligned_storage_t = typename aligned_storage < Len, Align > :: type ;
(desde C++14)
(obsoleto en C++23)

Notas

El tipo definido por std::aligned_storage<>::type puede utilizarse para crear bloques de memoria no inicializados adecuados para contener objetos de un tipo dado, opcionalmente alineados de manera más estricta que su requisito de alineación natural, por ejemplo en un límite de caché o de página.

Al igual que con cualquier otro almacenamiento no inicializado, los objetos se crean utilizando placement new y se destruyen con llamadas explícitas al destructor.

Implementación posible

Excepto para el argumento predeterminado, aligned_storage es expresable en términos de alignas:

template<std::size_t Len, std::size_t Align = /* default alignment not implemented */>
struct aligned_storage
{
    struct type
    {
        alignas(Align) unsigned char data[Len];
    };
};

Ejemplo

Una clase vector estática primitiva, que demuestra la creación, acceso y destrucción de objetos en almacenamiento alineado.

#include <cstddef>
#include <iostream>
#include <new>
#include <string>
#include <type_traits>
template<class T, std::size_t N>
class static_vector
{
    // Properly aligned uninitialized storage for N T's
    std::aligned_storage_t<sizeof(T), alignof(T)> data[N];
    std::size_t m_size = 0;
public:
    // Create an object in aligned storage
    template<typename ...Args> void emplace_back(Args&&... args)
    {
        if (m_size >= N) // Possible error handling
            throw std::bad_alloc{};
        // Construct value in memory of aligned storage using inplace operator new
        ::new(&data[m_size]) T(std::forward<Args>(args)...);
        ++m_size;
    }
    // Access an object in aligned storage
    const T& operator[](std::size_t pos) const
    {
        // Note: std::launder is needed after the change of object model in P0137R1
        return *std::launder(reinterpret_cast<const T*>(&data[pos]));
    }
    // Destroy objects from aligned storage
    ~static_vector()
    {
        for (std::size_t pos = 0; pos < m_size; ++pos)
            // Note: std::launder is needed after the change of object model in P0137R1
            std::destroy_at(std::launder(reinterpret_cast<T*>(&data[pos])));
    }
};
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:

*****
**********

Véase también

alignas (C++11) especifica que el almacenamiento para la variable debe estar alineado por una cantidad específica
(especificador)
obtiene los requisitos de alineación del tipo
(plantilla de clase)
asigna memoria alineada
(función)
(desde C++11) (obsoleto en C++23)
define el tipo adecuado para usar como almacenamiento no inicializado para todos los tipos dados
(plantilla de clase)
tipo trivial con requisito de alineación tan grande como cualquier otro tipo escalar
(typedef)
(C++17)
barrera de optimización de punteros
(plantilla de función)