alignas
(C++)
Описатель alignas
изменяет выравнивание типа или объекта в памяти.
Синтаксис
alignas(expression)
alignas(type-id)
alignas(pack...)
Замечания
Вы можете использовать alignas
описатель в объявлении переменных или в объявлении переменнойclass
struct
union
.
Для alignas(expression)
этого выражения должно быть целочисленное константное выражение, равное 0 или значение 2 (1, 2, 4, 8, 16, ...). Все остальные выражения являются плохо сформированными.
Используйте alignas
вместо __declspec(align(#))
переносимости кода.
Обычно используется alignas
для управления выравниванием определяемого пользователем типа, как показано в следующем примере:
struct alignas(8) S1
{
int x;
};
static_assert(alignof(S1) == 8, "alignof(S1) should be 8");
При применении нескольких alignas
к одному объявлению используется одно и то же объявление с наибольшим значением. alignas
Значение 0
игнорируется.
В следующем примере показано, как использовать alignas
с определяемым пользователем типом:
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)");
Тип можно указать как значение выравнивания. Выравнивание по умолчанию типа используется в качестве значения выравнивания, как показано в следующем примере:
struct alignas(double) S2
{
int x;
};
static_assert(alignof(S2) == alignof(double), "alignof(S2) should be equivalent to alignof(double)");
Пакет параметров шаблона (alignas (pack...)
) можно использовать для значения выравнивания. Используется наибольшее значение выравнивания всех элементов в пакете.
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");
Если применяется несколько alignas
, результирующее выравнивание является самым большим из всех alignas
значений и не может быть меньше естественного выравнивания типа, к который он применяется.
Объявление и определение определяемых пользователем типов должны иметь то же значение выравнивания.
// 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
}
См. также
#pragma pack
Выравнивание
alignof
Ошибка компилятора C2023
Предупреждение компилятора C4359
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по