alignas (C++)

O alignas especificador altera o alinhamento de um tipo ou objeto na memória.

Sintaxe

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

Comentários

Você pode usar alignas o especificador em uma structdeclaração de , , classunionou variável.

Para alignas(expression), a expressão deve ser uma expressão constante integral que é 0 ou um poder de 2 (1, 2, 4, 8, 16, ...). Todas as outras expressões são mal formadas.

Use alignas em vez de para portabilidade de __declspec(align(#)) código.

Um uso comum de é para controlar o alinhamento de alignas um tipo definido pelo usuário, conforme mostrado no exemplo a seguir:

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

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

Quando múltiplos alignas são aplicados à mesma declaração, aquele com o maior valor é usado. Um alignas valor de 0 é ignorado.

O exemplo a seguir mostra como usar alignas com um tipo definido pelo usuário:

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

Você pode fornecer um tipo como o valor de alinhamento. O alinhamento padrão do tipo é usado como o valor de alinhamento, conforme mostrado no exemplo a seguir:

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

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

Um pacote de parâmetros de modelo (alignas (pack...)) pode ser usado para o valor de alinhamento. O maior valor de alinhamento de todos os elementos da embalagem é usado.

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

Se múltiplos alignas forem aplicados, o alinhamento resultante será o maior de todos os alignas valores e não poderá ser menor que o alinhamento natural do tipo ao qual é aplicado.

A declaração e a definição de tipos definidos pelo usuário devem ter o mesmo valor de alinhamento.

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

Confira também

#pragma pack
Alinhamento
alignof
Erro do compilador C2023
Aviso do compilador C4359