Namespaces
Variants

_Alignas (since C11) (deprecated in C23) , alignas (since C23)

From cppreference.net

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

Содержание

Синтаксис

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

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

(до C23)

Объяснение

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

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

1,2) результат выражения , если он не равен нулю
3,4) требование выравнивания для type , то есть _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 также может применяться к объявлениям типов классов/структур/объединений и перечислений. Это не поддерживается в 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 Applied to Behavior as published Correct behavior
DR 444 C11 _Alignas was not allowed in struct and union members allowed

Ссылки

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

Смотрите также

тип с требованием выравнивания таким же большим, как у любого другого скалярного типа
(typedef)
_Alignof (до C23) alignof (с C23) запрашивает требования выравнивания объекта
(оператор)
Документация C++ для alignas спецификатора