Namespaces
Variants

_Alignas (since C11) (deprecated in C23) , alignas (since C23)

From cppreference.net

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é _Alignas est également disponible comme macro de commodité alignas , disponible dans l'en-tête <stdalign.h> .

(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 à

1,2) le résultat de l' expression , sauf s'il est nul
3,4) l'exigence d'alignement du type , c'est-à-dire _Alignof ( type ) (jusqu'en C23) alignof ( type ) (depuis C23)

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

alignas , _Alignas

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

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