std:: aligned_storage
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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) |
|
(C++11)
|
obtient les exigences d'alignement du type
(modèle de classe) |
|
(C++17)
|
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) |
|
(C++11)
|
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) |