_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 не разрешалось в членах struct и union | разрешено |
Ссылки
- Стандарт 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