_Alignas (since C11) (deprecated in C23) , alignas (since C23)
Появляется в объявлении как один из спецификаторов типа для изменения требования выравнивания объявляемого объекта.
Содержание |
Синтаксис
_Alignas
(
выражение
)
|
(1) | (начиная с C11) | |||||||
alignas
(
выражение
)
|
(2) | (начиная с C23) | |||||||
_Alignas
(
тип
)
|
(3) | (начиная с C11) | |||||||
alignas
(
тип
)
|
(4) | (начиная с C23) | |||||||
| expression | - | любое целочисленное константное выражение , значение которого является допустимым выравниванием или нулем |
| type | - | любое имя типа |
|
Ключевое слово
|
(до C23) |
Объяснение
Спецификатор
_Alignas
(до C23)
alignas
(начиная с C23)
может использоваться только при объявлении объектов, которые не являются
битовыми полями
и не имеют
класса хранения register
. Он не может использоваться в объявлениях параметров функций и не может использоваться в typedef.
При использовании в объявлении, объявляемый объект будет иметь свое требование выравнивания установленным в
за исключением случаев, когда это ослабило бы выравнивание, которое тип имел бы естественным образом.
Если expression принимает значение ноль, данный спецификатор не оказывает никакого эффекта.
Когда несколько
_Alignas
(до C23)
alignas
(начиная с C23)
спецификаторов появляются в одном объявлении, используется самый строгий из них.
_Alignas
(до C23)
alignas
(начиная с C23)
спецификатор должен появляться только в
определении
объекта, но если какое-либо объявление использует
_Alignas
(до C23)
alignas
(начиная с C23)
, оно должно указывать то же выравнивание, что и
_Alignas
(до C23)
alignas
(начиная с C23)
в определении. Поведение не определено, если разные единицы трансляции указывают разное выравнивание для одного и того же объекта.
Примечания
В C++ спецификатор
alignas
также может применяться к объявлениям типов классов/структур/объединений и перечислений. Это не поддерживается в C, но выравнивание типа структуры можно контролировать с помощью
_Alignas
(до C23)
alignas
(начиная с C23)
в объявлении члена структуры.
Ключевые слова
Пример
#include <stdalign.h> #include <stdio.h> // every object of type struct sse_t will be aligned to 16-byte boundary // (note: needs support for DR 444) struct sse_t { alignas(16) float sse_data[4]; }; // every object of type struct data will be aligned to 128-byte boundary struct data { char x; alignas(128) char cacheline[128]; // over-aligned array of char, // not array of over-aligned chars }; int main(void) { printf("sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)\n", sizeof(struct data)); printf("alignment of sse_t is %zu\n", alignof(struct sse_t)); alignas(2048) struct data d; // this instance of data is aligned even stricter (void)d; // suppresses "maybe unused" warning }
Вывод:
sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array) alignment of sse_t is 16
Отчёты о дефектах
Следующие отчеты о дефектах, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| DR 444 | C11 |
_Alignas
was not allowed in struct and union members
|
allowed |
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 6.7.5 Спецификатор выравнивания (стр.: TBD)
-
- 6.2.8 Выравнивание объектов (стр.: TBD)
-
- 7.15 Выравнивание <stdalign.h> (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 6.7.5 Спецификатор выравнивания (стр: 92)
-
- 6.2.8 Выравнивание объектов (стр: 36-37)
-
- 7.15 Выравнивание <stdalign.h> (стр: 196)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 6.7.5 Спецификатор выравнивания (стр: 127-128)
-
- 6.2.8 Выравнивание объектов (стр: 48-49)
-
- 7.15 Выравнивание <stdalign.h> (стр: 268)
Смотрите также
|
(C11)
|
тип с требованием выравнивания таким же большим, как у любого другого скалярного типа
(typedef) |
| _Alignof (до C23) alignof (с C23) |
запрашивает требования выравнивания объекта
(оператор) |
|
Документация C++
для
alignas
спецификатора
|
|