alignas (C++)

Le alignas spécificateur modifie l’alignement d’un type ou d’un objet en mémoire.

Syntaxe

alignas(expression)
alignas(type-id)
alignas(pack...)

Notes

Vous pouvez utiliser alignas le spécificateur sur une structdéclaration de variable, ou unionun , class

Pour alignas(expression), l’expression doit être une expression constante intégrale qui est 0 ou une puissance de 2 (1, 2, 4, 8, 16, ...). Toutes les autres expressions sont mal formées.

Utilisez alignas plutôt que pour la portabilité du __declspec(align(#)) code.

Une utilisation alignas courante consiste à contrôler l’alignement d’un type défini par l’utilisateur, comme illustré dans l’exemple suivant :

struct alignas(8) S1
{
    int x;
};

static_assert(alignof(S1) == 8, "alignof(S1) should be 8");

Lorsque plusieurs alignas sont appliqués à la même déclaration, celui dont la valeur est la plus élevée est utilisée. La alignas valeur est 0 ignorée.

L’exemple suivant montre comment utiliser alignas avec un type défini par l’utilisateur :

class alignas(4) alignas(16) C1 {};

// `alignas(0)` ignored
union alignas(0) U1
{
    int i;
    float f;
};

union U2
{
    int i;
    float f;
};

static_assert(alignof(C1) == 16, "alignof(C1) should be 16");
static_assert(alignof(U1) == alignof(U2), "alignof(U1) should be equivalent to alignof(U2)");

Vous pouvez fournir un type comme valeur d’alignement. L’alignement par défaut du type est utilisé comme valeur d’alignement, comme illustré dans l’exemple suivant :

struct alignas(double) S2
{
    int x;
};

static_assert(alignof(S2) == alignof(double), "alignof(S2) should be equivalent to alignof(double)");

Un pack de paramètres de modèle (alignas (pack...)) peut être utilisé pour la valeur d’alignement. La plus grande valeur d’alignement de tous les éléments du pack est utilisée.

template <typename... Ts>
class alignas(Ts...) C2
{
    char c;
};

static_assert(alignof(C2<>) == 1, "alignof(C2<>) should be 1");
static_assert(alignof(C2<short, int>) == 4, "alignof(C2<short, int>) should be 4");
static_assert(alignof(C2<int, float, double>) == 8, "alignof(C2<int, float, double>) should be 8");

Si plusieurs alignas sont appliqués, l’alignement obtenu est le plus grand de toutes les alignas valeurs et ne peut pas être inférieur à l’alignement naturel du type auquel il est appliqué.

La déclaration et la définition des types définis par l’utilisateur doivent avoir la même valeur d’alignement.

// Declaration of `C3`
class alignas(16) C3;

// Definition of `C3` with differing alignment value
class alignas(32) C3 {}; // Error: C2023 'C3': Alignment (32) different from prior declaration (16)

int main()
{
    alignas(2) int x; // ill-formed because the natural alignment of int is 4
}

Voir aussi

#pragma pack
Alignment
alignof
Erreur du compilateur C2023
Avertissement du compilateur C4359