Spec-Zone.ru › C

_Alignas (начиная с C11)(устарело в C23), alignas (начиная с C23)

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

Синтаксис

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

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

(до C23)

Пояснение

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

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

1,2) результату expression, если он не равен нулю
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 также можно применять к объявлениям типов class/struct/union и перечислений. В C это не поддерживается, однако выравниванием типа struct можно управлять, используя _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: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)

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/language/alignas

Spec-Zone.ru

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