alignas (C++)

Der alignas Bezeichner ändert die Ausrichtung eines Typs oder Objekts im Arbeitsspeicher.

Syntax

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

Hinweise

Sie können den Bezeichner für eine structclassunionDeklaration oder variable Deklaration verwenden.alignas

For alignas(expression), the expression must be an integral constant expression that is 0 or a power of 2 (1, 2, 4, 8, 16, ...). Alle anderen Ausdrücke sind unformiert.

Verwenden Sie alignas anstelle der __declspec(align(#)) Codeübertragbarkeit.

Eine häufige Verwendung alignas besteht darin, die Ausrichtung eines benutzerdefinierten Typs zu steuern, wie im folgenden Beispiel gezeigt:

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

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

Wenn mehrere alignas auf dieselbe Deklaration angewendet werden, wird die Deklaration mit dem größten Wert verwendet. Ein alignas Wert von 0 wird ignoriert.

Das folgende Beispiel zeigt die Verwendung alignas mit einem benutzerdefinierten Typ:

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)");

Sie können einen Typ als Ausrichtungswert angeben. Die Standardausrichtung des Typs wird wie im folgenden Beispiel dargestellt als Ausrichtungswert verwendet:

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

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

Ein Vorlagenparameterpaket (alignas (pack...)) kann für den Ausrichtungswert verwendet werden. Der größte Ausrichtungswert aller Elemente im Pack wird verwendet.

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");

Wenn mehrere alignas angewendet werden, ist die resultierende Ausrichtung die größte aller alignas Werte und kann nicht kleiner als die natürliche Ausrichtung des Typs sein, auf den sie angewendet wird.

Die Deklaration und Definition von benutzerdefinierten Typen muss denselben Ausrichtungswert aufweisen.

// 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
}

Siehe auch

#pragma pack
Ausrichtung
alignof
Compilerfehler C2023
Compilerwarnung C4359