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
, union
lub .
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ść alignas
0
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
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla