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
Défini dans l'en-tête <type_traits>
template < std:: size_t Len, std:: size_t Align = /* default-alignment */ >
struct aligned_storage ;
(depuis C++11)
(obsolète en C++23)

Fournit le type imbriqué type , qui satisfait TrivialType et StandardLayoutType et convient comme stockage non initialisé pour tout objet dont la taille est au plus Len et dont l' exigence d'alignement est un diviseur de Align .

La valeur par défaut de Align est l'exigence d'alignement la plus stricte (la plus grande) pour tout objet dont la taille est au plus Len . Si la valeur par défaut n'est pas utilisée, Align doit être la valeur de alignof ( T ) pour un certain type T , sinon le comportement est indéfini.

Le comportement est indéfini si Len == 0 .

Il est défini par l'implémentation si un alignement étendu est pris en charge.

Si le programme ajoute des spécialisations pour std::aligned_storage , le comportement est indéfini.

Table des matières

Types membres

Nom Définition
type un type trivial et standard-layout d'au moins la taille Len avec une exigence d'alignement Align

Types auxiliaires

template < std:: size_t Len, std:: size_t Align = /* alignement par défaut */ >
using aligned_storage_t = typename aligned_storage < Len, Align > :: type ;
(depuis C++14)
(obsolète en C++23)

Notes

Le type défini par std::aligned_storage<>::type peut être utilisé pour créer des blocs de mémoire non initialisés adaptés à contenir des objets d'un type donné, optionnellement alignés plus strictement que leur alignement naturel requis, par exemple sur une limite de cache ou de page.

Comme pour tout autre stockage non initialisé, les objets sont créés en utilisant placement new et détruits avec des appels explicites au destructeur.

Implémentation possible

Sauf pour l'argument par défaut, aligned_storage est exprimable en termes de alignas :

template<std::size_t Len, std::size_t Align = /* alignement par défaut non implémenté */>
struct aligned_storage
{
    struct type
    {
        alignas(Align) unsigned char data[Len];
    };
};

Exemple

Une classe vectorielle statique primitive, démontrant la création, l'accès et la destruction d'objets dans un stockage aligné.

#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';
}

Sortie :

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

Voir aussi

alignas (C++11) spécifie que le stockage de la variable doit être aligné selon une quantité spécifique
(spécificateur)
obtient les exigences d'alignement du type
(modèle de classe)
alloue de la mémoire alignée
(fonction)
(depuis C++11) (obsolète en C++23)
définit le type approprié pour une utilisation comme stockage non initialisé pour tous les types donnés
(modèle de classe)
type trivial avec une exigence d'alignement aussi grande que tout autre type scalaire
(typedef)
(C++17)
barrière d'optimisation de pointeur
(modèle de fonction)