alignas
specifier
(since C++11)
Spécifie l' exigence d'alignement d'un type ou d'un objet.
Table des matières |
Syntaxe
alignas(
expression
)
|
|||||||||
alignas(
type-id
)
|
|||||||||
alignas(
pack
...
)
|
|||||||||
Explication
Le alignas spécificateur peut être appliqué à :
- la déclaration ou la définition d'une classe ;
- la déclaration d'un membre de données de classe non-champ de bits ;
-
la déclaration d'une variable, sauf qu'elle ne peut pas être appliquée aux éléments suivants :
- un paramètre de fonction ;
- le paramètre d'exception d'une clause catch.
L'objet ou le type déclaré par une telle déclaration aura son
exigence d'alignement
égale à l'expression non nulle la plus stricte (la plus grande)
expression
de tous les spécificateurs
alignas
utilisés dans la déclaration, sauf si cela affaiblirait l'alignement naturel du type.
Si le plus strict (le plus grand)
alignas
sur une déclaration est plus faible que l'alignement qu'il aurait sans aucun
alignas
spécificateur (c'est-à-dire plus faible que son alignement naturel ou plus faible que
alignas
sur une autre déclaration du même objet ou type), le programme est mal formé :
struct alignas(8) S {}; struct alignas(1) U { S s; }; // erreur : l'alignement de U aurait été 8 sans alignas(1)
Les alignements non nuls invalides, tels que alignas ( 3 ) sont mal formés.
Les alignements valides non nuls qui sont plus faibles qu'un autre alignas sur la même déclaration sont ignorés.
alignas ( 0 ) est toujours ignoré.
Notes
À partir de la norme ISO C11, le langage C possède le mot-clé _Alignas et définit alignas comme une macro de préprocesseur s'étendant au mot-clé dans l'en-tête <stdalign.h> .
En C++, ceci est un mot-clé, et
|
les en-têtes <stdalign.h> et <cstdalign> ne définissent pas une telle macro. Ils définissent cependant la constante macro __alignas_is_defined . |
(jusqu'à C++20) |
|
l'en-tête <stdalign.h> ne définit pas une telle macro. Il définit cependant la constante macro __alignas_is_defined . |
(depuis C++20) |
Mots-clés
Exemple
#include <iostream> // Chaque objet de type struct_float sera aligné // sur une limite alignof(float) (généralement 4) : struct alignas(float) struct_float { // votre définition ici }; // Chaque objet de type sse_t sera aligné sur une limite de 32 octets : struct alignas(32) sse_t { float sse_data[4]; }; int main() { struct default_aligned { float data[4]; } a, b, c; sse_t x, y, z; std::cout << "alignof(struct_float) = " << alignof(struct_float) << '\n' << "sizeof(sse_t) = " << sizeof(sse_t) << '\n' << "alignof(sse_t) = " << alignof(sse_t) << '\n' << std::hex << std::showbase << "&a: " << &a << "\n" "&b: " << &b << "\n" "&c: " << &c << "\n" "&x: " << &x << "\n" "&y: " << &y << "\n" "&z: " << &z << '\n'; }
Sortie possible :
alignof(struct_float) = 4 sizeof(sse_t) = 32 alignof(sse_t) = 32 &a: 0x7fffcec89930 &b: 0x7fffcec89940 &c: 0x7fffcec89950 &x: 0x7fffcec89960 &y: 0x7fffcec89980 &z: 0x7fffcec899a0
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| CWG 1437 | C++11 | alignas pouvait être utilisé dans les déclarations d'alias | interdit |
| CWG 2354 | C++11 | alignas pouvait être appliqué à la déclaration d'une énumération | interdit |
Références
- Norme C++23 (ISO/CEI 14882:2024) :
-
- 9.12.4 Attribut porte une dépendance [dcl.attr.depend]
- Norme C++20 (ISO/IEC 14882:2020) :
-
- 9.12.3 Attribut porte une dépendance [dcl.attr.depend]
- Norme C++17 (ISO/CEI 14882:2017) :
-
- 10.6.3 Attribut porte une dépendance [dcl.attr.depend]
- Norme C++14 (ISO/CEI 14882:2014) :
-
- 7.6.4 Attribut porte une dépendance [dcl.attr.depend]
- Norme C++11 (ISO/CEI 14882:2011) :
-
- 7.6.4 Attribut porte une dépendance [dcl.attr.depend]
Voir aussi
alignof
(C++11)
|
interroge les exigences d'alignement d'un type
(opérateur) |
|
(C++11)
|
obtient les exigences d'alignement du type
(modèle de classe) |
|
Documentation C
pour
_Alignas, alignas
|
|