Udostępnij za pośrednictwem


alignas (C++)

Specyfikator alignas zmienia wyrównanie typu lub obiektu w pamięci.

Składnia

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

Uwagi

Specyfikator można użyć alignas w deklaracji zmiennej struct, class, unionlub .

W przypadku alignas(expression)wyrażenia wyrażenie musi być wyrażeniem stałej całkowitej, które ma wartość 0 lub moc 2 (1, 2, 4, 8, 16, ...). Wszystkie inne wyrażenia są źle sformułowane.

Użyj alignas zamiast __declspec(align(#)) do przenoszenia kodu.

Typowym zastosowaniem funkcji alignas jest kontrolowanie wyrównania typu zdefiniowanego przez użytkownika, jak pokazano w poniższym przykładzie:

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

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

W przypadku zastosowania wielu alignas do tej samej deklaracji zostanie użyta jedna z największą wartością. Wartość alignas0 jest ignorowana.

W poniższym przykładzie pokazano, jak używać z alignas typem zdefiniowanym przez użytkownika:

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

Typ można podać jako wartość wyrównania. Domyślne wyrównanie typu jest używane jako wartość wyrównania, jak pokazano w poniższym przykładzie:

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

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

Dla wartości wyrównania można użyć pakietu parametrów szablonu (alignas (pack...)). Jest używana największa wartość wyrównania wszystkich elementów w pakiecie.

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

Jeśli zastosowano wiele alignas , wynikowe wyrównanie jest największe ze wszystkich alignas wartości i nie może być mniejsze niż naturalne wyrównanie typu, do których jest stosowany.

Deklaracja i definicja typów zdefiniowanych przez użytkownika muszą mieć tę samą wartość wyrównania.

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

Zobacz też

#pragma pack
Wyrównanie
alignof
Błąd kompilatora C2023
Ostrzeżenie kompilatora C4359