alignas specifier (начиная с C++11)
Задаёт требование к выравниванию типа или объекта.
Синтаксис
alignas( expression ) | ||
alignas( type-id ) | ||
alignas( pack ... ) |
alignas(alignof( type-id )).Пояснение
Спецификатор alignas может применяться к:
- объявлению или определению класса;
- объявлению нестатического члена данных класса, не являющегося битовым полем;
- объявлению переменной, за исключением следующих случаев:
- параметр функции;
- параметр-исключение предложения catch.
Объект или тип, объявленный таким объявлением, будет иметь требование к выравниванию, равное самому строгому (наибольшему) ненулевому выражению expression среди всех спецификаторов alignas, использованных в объявлении, если это не ослабляет естественное выравнивание типа.
Если самый строгий (наибольший) alignas в объявлении слабее выравнивания, которое было бы у него без спецификаторов alignas (то есть слабее его естественного выравнивания или слабее alignas в другом объявлении того же объекта или типа), программа некорректна:
struct alignas(8) S {};
struct alignas(1) U { S s; }; // error: alignment of U would have been 8 without alignas(1)
Недопустимые ненулевые значения выравнивания, например alignas(3), приводят к некорректной программе.
Допустимые ненулевые значения выравнивания, которые слабее другого alignas в том же объявлении, игнорируются.
alignas(0) всегда игнорируется.
Примечания
Начиная со стандарта ISO C11, язык C содержит ключевое слово _Alignas и определяет alignas как макрос препроцессора, раскрывающийся в это ключевое слово в заголовочном файле <stdalign.h>.
В C++ это ключевое слово, и
| заголовочные файлы | (до C++20) |
| заголовочный файл | (начиная с C++20) |
Ключевые слова
Пример
#include <iostream>
// Every object of type struct_float will be aligned
// to alignof(float) boundary (usually 4):
struct alignas(float) struct_float
{
// your definition here
};
// Every object of type sse_t will be aligned to 32-byte boundary:
struct alignas(32) sse_t
{
float sse_data[4];
};
int main()
{
struct default_aligned
{
float data[4];
} a, b, c;
sse_t x, y, z;
std::cout
<< "alignof(struct_float) = " << alignof(struct_float) << '\n'
<< "sizeof(sse_t) = " << sizeof(sse_t) << '\n'
<< "alignof(sse_t) = " << alignof(sse_t) << '\n'
<< std::hex << std::showbase
<< "&a: " << &a << "\n"
"&b: " << &b << "\n"
"&c: " << &c << "\n"
"&x: " << &x << "\n"
"&y: " << &y << "\n"
"&z: " << &z << '\n';
}
Возможный вывод:
alignof(struct_float) = 4 sizeof(sse_t) = 32 alignof(sse_t) = 32 &a: 0x7fffcec89930 &b: 0x7fffcec89940 &c: 0x7fffcec89950 &x: 0x7fffcec89960 &y: 0x7fffcec89980 &z: 0x7fffcec899a0
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| CWG 1437 | C++11 | alignas можно было использовать в объявлениях псевдонимов | запрещено |
| CWG 2354 | C++11 | alignas можно было применять к объявлению перечисления | запрещено |
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
- 9.12.4 Атрибут зависимости [dcl.attr.depend]
- Стандарт C++20 (ISO/IEC 14882:2020):
- 9.12.3 Атрибут зависимости [dcl.attr.depend]
- Стандарт C++17 (ISO/IEC 14882:2017):
- 10.6.3 Атрибут зависимости [dcl.attr.depend]
- Стандарт C++14 (ISO/IEC 14882:2014):
- 7.6.4 Атрибут зависимости [dcl.attr.depend]
- Стандарт C++11 (ISO/IEC 14882:2011):
- 7.6.4 Атрибут зависимости [dcl.attr.depend]
См. также
alignof (C++11) | запрашивает требования к выравниванию типа (оператор) |
|
(C++11) | получает требования к выравниванию типа (шаблон класса) |
Документация по C для _Alignas, alignas |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/alignas