_Alignas (начиная с C11)(устарело в C23), alignas (начиная с C23)
Используется в синтаксисе объявления как один из спецификаторов типа для изменения требования к выравниванию объявляемого объекта.
Синтаксис
_Alignas ( expression ) | (1) | (начиная с C11) |
alignas ( expression ) | (2) | (начиная с C23) |
_Alignas ( type ) | (3) | (начиная с C11) |
alignas ( type ) | (4) | (начиная с C23) |
| expression | - | любое целочисленное константное выражение, значение которого является допустимым выравниванием или нулём |
| type | - | любое имя типа |
| Ключевое слово | (до C23) |
Пояснение
Спецификатор _Alignas(до C23)alignas(начиная с C23) можно использовать только при объявлении объектов, которые не являются битовыми полями и не имеют класс хранения register. Его нельзя использовать в объявлениях параметров функций и в typedef.
При использовании в объявлении для объявленного объекта устанавливается требование к выравниванию, равное
_Alignof(type)(до C23)alignof(type)(начиная с C23)
за исключением случаев, когда это ослабило бы естественное выравнивание типа.
Если вычисленное значение expression равно нулю, этот спецификатор не оказывает никакого эффекта.
Если в одном объявлении указано несколько спецификаторов _Alignas(до C23)alignas(начиная с C23), используется самый строгий из них.
Спецификатор _Alignas(до C23)alignas(начиная с C23) достаточно указать только в определении объекта, но если в каком-либо объявлении используется _Alignas(до C23)alignas(начиная с C23), в нём должно быть указано то же выравнивание, что и у _Alignas(до C23)alignas(начиная с C23) в определении. Поведение не определено, если в разных единицах трансляции для одного и того же объекта указаны разные выравнивания.
Примечания
В C++ спецификатор alignas также можно применять к объявлениям типов class/struct/union и перечислений. В C это не поддерживается, однако выравниванием типа struct можно управлять, используя _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 | Применяется к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| DR 444 | C11 |
_Alignas не разрешалось в членах структур и объединений | разрешено |
Ссылки
- Стандарт 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 |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/language/alignas