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 struct
declaração de , , class
union
ou 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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de