alignas
specifier
(since C++11)
Определяет требование выравнивания типа или объекта.
Содержание |
Синтаксис
alignas(
выражение
)
|
|||||||||
alignas(
идентификатор-типа
)
|
|||||||||
alignas(
пакет
...
)
|
|||||||||
Объяснение
Спецификатор alignas может применяться к:
- объявление или определение класса ;
- объявление элемента данных класса, не являющегося битовым полем;
-
объявление переменной, за исключением следующих случаев:
- параметр функции;
- параметр исключения в блоке catch.
Объект или тип, объявленный таким объявлением, будет иметь своё
требование выравнивания
равным самому строгому (наибольшему) ненулевому
выражению
среди всех спецификаторов
alignas
, использованных в объявлении, если это не ослабит естественное выравнивание типа.
Если самый строгий (наибольший)
alignas
в объявлении слабее выравнивания, которое было бы без каких-либо
alignas
спецификаторов (то есть слабее его естественного выравнивания или слабее
alignas
в другом объявлении того же объекта или типа), программа является некорректной:
struct alignas(8) S {}; struct alignas(1) U { S s; }; // ошибка: выравнивание U было бы 8 без alignas(1)
Недопустимые ненулевые выравнивания, такие как alignas ( 3 ) являются некорректными.
Допустимые ненулевые выравнивания, которые слабее другого alignas в том же объявлении, игнорируются.
alignas ( 0 ) всегда игнорируется.
Примечания
Начиная со стандарта ISO C11, язык C имеет ключевое слово _Alignas и определяет alignas как макрос препроцессора, раскрывающийся в ключевое слово в заголовочном файле <stdalign.h> .
В C++ это ключевое слово, и
|
заголовки <stdalign.h> и <cstdalign> не определяют такой макрос. Однако они определяют макроконстанту __alignas_is_defined . |
(до C++20) |
|
заголовок <stdalign.h> не определяет такой макрос. Однако он определяет макроконстанту __alignas_is_defined . |
(начиная с C++20) |
Ключевые слова
Пример
#include <iostream> // Каждый объект типа struct_float будет выровнен // по границе alignof(float) (обычно 4): struct alignas(float) struct_float { // ваше определение здесь }; // Каждый объект типа sse_t будет выровнен по 32-байтной границе: 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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| CWG 1437 | C++11 | alignas could be used in alias declarations | prohibited |
| CWG 2354 | C++11 | alignas could be applied to the declaration of an enumeration | prohibited |
Ссылки
- Стандарт 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
|
|