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 не разрешалось в членах структур и объединений разрешено

Ссылки

  • Стандарт 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