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