_Alignas (since C11) (deprecated in C23) , alignas (since C23)
Apparaît dans la déclaration syntaxe comme l'un des spécificateurs de type pour modifier les exigences d'alignement de l'objet déclaré.
Table des matières |
Syntaxe
_Alignas
(
expression
)
|
(1) | (depuis C11) | |||||||
alignas
(
expression
)
|
(2) | (depuis C23) | |||||||
_Alignas
(
type
)
|
(3) | (depuis C11) | |||||||
alignas
(
type
)
|
(4) | (depuis C23) | |||||||
| expression | - | toute expression constante entière dont la valeur est un alignement valide ou zéro |
| type | - | tout nom de type |
|
Le mot-clé
|
(jusqu'à C23) |
Explication
Le spécificateur
_Alignas
(jusqu'à C23)
alignas
(depuis C23)
ne peut être utilisé que pour déclarer des objets qui ne sont pas des
champs de bits
et qui n'ont pas la classe de stockage
register
. Il ne peut pas être utilisé dans les déclarations de paramètres de fonction, ni dans un typedef.
Lorsqu'il est utilisé dans une déclaration, l'objet déclaré aura son alignement requis défini à
sauf lorsque cela affaiblirait l'alignement que le type aurait eu naturellement.
Si expression s'évalue à zéro, ce spécificateur n'a aucun effet.
Lorsque plusieurs
_Alignas
(jusqu'en C23)
alignas
(depuis C23)
sont présents dans la même déclaration, le plus restrictif est utilisé.
_Alignas
(jusqu'en C23)
alignas
(depuis C23)
le spécificateur doit uniquement apparaître sur la
définition
d'un objet, mais si une déclaration utilise
_Alignas
(jusqu'en C23)
alignas
(depuis C23)
, elle doit spécifier le même alignement que le
_Alignas
(jusqu'en C23)
alignas
(depuis C23)
sur la définition. Le comportement est indéfini si différentes unités de traduction spécifient des alignements différents pour le même objet.
Notes
En C++, le spécificateur
alignas
peut également être appliqué aux déclarations de types classe/struct/union et énumérations. Ceci n'est pas pris en charge en C, mais l'alignement d'un type struct peut être contrôlé en utilisant
_Alignas
(jusqu'à C23)
alignas
(depuis C23)
dans une déclaration de membre.
Mots-clés
Exemple
#include <stdalign.h> #include <stdio.h> // every object of type struct sse_t will be aligned to 16-byte boundary // (note: needs support for DR 444) struct sse_t { alignas(16) float sse_data[4]; }; // every object of type struct data will be aligned to 128-byte boundary struct data { char x; alignas(128) char cacheline[128]; // over-aligned array of char, // not array of over-aligned chars }; int main(void) { printf("sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)\n", sizeof(struct data)); printf("alignment of sse_t is %zu\n", alignof(struct sse_t)); alignas(2048) struct data d; // this instance of data is aligned even stricter (void)d; // suppresses "maybe unused" warning }
Sortie :
sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array) alignment of sse_t is 16
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C publiées antérieurement.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| DR 444 | C11 |
_Alignas
n'était pas autorisé dans les membres de struct et union
|
autorisé |
Références
- Norme C23 (ISO/CEI 9899:2024) :
-
- 6.7.5 Spécificateur d'alignement (p: TBD)
-
- 6.2.8 Alignement des objets (p: TBD)
-
- 7.15 Alignement <stdalign.h> (p: TBD)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 6.7.5 Spécificateur d'alignement (p: 92)
-
- 6.2.8 Alignement des objets (p: 36-37)
-
- 7.15 Alignement <stdalign.h> (p: 196)
- Norme C11 (ISO/IEC 9899:2011) :
-
- 6.7.5 Spécificateur d'alignement (p: 127-128)
-
- 6.2.8 Alignement des objets (p: 48-49)
-
- 7.15 Alignement <stdalign.h> (p: 268)
Voir aussi
|
(C11)
|
un type avec une exigence d'alignement aussi grande que tout autre type scalaire
(typedef) |
| _Alignof (jusqu'en C23) alignof (depuis C23) |
interroge les exigences d'alignement d'un objet
(opérateur) |
|
Documentation C++
pour
alignas
spécificateur
|
|