Spec-Zone.ru › C

_Alignas (с C11), alignas (с C23)

Появляется в синтаксисе объявлений как один из спецификаторов типа для изменения требования к выравниванию объявляемого объекта.

Синтаксис

_Alignas ( выражение ) (1) (с C11)
alignas ( выражение ) (2) (с C23)
_Alignas ( тип ) (3) (с C11)
alignas ( тип ) (4) (с C23)
выражение - любое целочисленное константное выражение, значение которого является допустимым выравниванием или нулём
тип - любое имя типа

Ключевое слово _Alignas также доступно как макрос удобства alignas, доступный в заголовочном файле <stdalign.h>.

(до C23)

Объяснение

Спецификатор _Alignas(до C23)alignas(с C23) может использоваться только при объявлении объектов, которые не являются битовыми полями и не имеют класса хранения register. Он не может использоваться в объявлениях параметров функций и в объявлениях typedef.

При использовании в объявлении объявленный объект будет иметь требование к выравниванию, установленное на

1,2) результат выражения, если он не равен нулю
3,4) требования к выравниванию типа, то есть к _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) в объявлении члена.

Ключевые слова

alignas, _Alignas

Пример

#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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API