Namespaces
Variants

alignas specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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 ... )
1) expression doit être une expression constante intégrale qui s'évalue à zéro, ou à une valeur valide pour un alignement ou un alignement étendu.
2) Équivalent à alignas ( alignof ( type-id ) ) .
3) Équivalent à plusieurs spécificateurs alignas appliqués à la même déclaration, un pour chaque membre du parameter pack , qui peut être un pack de paramètres de type ou de constante.

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

alignas

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)
obtient les exigences d'alignement du type
(modèle de classe)
Documentation C pour _Alignas, alignas