alignas
(C++)
El alignas
especificador cambia la alineación de un tipo o objeto en memoria.
Sintaxis
alignas(expression)
alignas(type-id)
alignas(pack...)
Comentarios
Puede usar alignas
el especificador en una struct
declaración de variable , class
, union
o .
Para alignas(expression)
, la expresión debe ser una expresión constante integral que sea 0 o una potencia de 2 (1, 2, 4, 8, 16, ...). Todas las demás expresiones tienen un formato incorrecto.
Use alignas
en lugar de para la portabilidad de __declspec(align(#))
código.
Un uso común de alignas
es controlar la alineación de un tipo definido por el usuario, como se muestra en el ejemplo siguiente:
struct alignas(8) S1
{
int x;
};
static_assert(alignof(S1) == 8, "alignof(S1) should be 8");
Cuando se aplican varios alignas
a la misma declaración, se usa el que tiene el valor más grande. Se omite un alignas
valor de 0
.
En el ejemplo siguiente se muestra cómo usar alignas
con un tipo definido por el usuario:
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)");
Puede proporcionar un tipo como valor de alineación. La alineación predeterminada del tipo se usa como valor de alineación, como se muestra en el ejemplo siguiente:
struct alignas(double) S2
{
int x;
};
static_assert(alignof(S2) == alignof(double), "alignof(S2) should be equivalent to alignof(double)");
Se puede usar un paquete de parámetros de plantilla (alignas (pack...)
) para el valor de alineación. Se usa el valor de alineación más grande de todos los elementos del paquete.
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 se aplican varios alignas
, la alineación resultante es la más grande de todos los alignas
valores y no puede ser menor que la alineación natural del tipo al que se aplica.
La declaración y definición de tipos definidos por el usuario deben tener el mismo valor de alineación.
// 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
}
Consulte también
#pragma pack
Alineación
alignof
Error del compilador C2023
Advertencia del compilador C4359