Spec-Zone.ru › C++

alignas specifier (начиная с C++11)

Задаёт требование к выравниванию типа или объекта.

Синтаксис

alignas( expression )
alignas( type-id )
alignas( pack ... )
1) expression должно быть целочисленным константным выражением, результатом вычисления которого является ноль или допустимое значение для выравнивания или расширенного выравнивания.
2) Эквивалентно alignas(alignof( type-id )).
3) Эквивалентно нескольким спецификаторам alignas, применённым к одному и тому же объявлению, по одному для каждого элемента пакета параметров, который может быть пакетом параметров типа или нетиповым пакетом параметров.

Пояснение

Спецификатор alignas может применяться к:

  • объявлению или определению класса;
  • объявлению нестатического члена данных класса, не являющегося битовым полем;
  • объявлению переменной, за исключением следующих случаев:
    • параметр функции;
    • параметр-исключение предложения catch.

Объект или тип, объявленный таким объявлением, будет иметь требование к выравниванию, равное самому строгому (наибольшему) ненулевому выражению expression среди всех спецификаторов alignas, использованных в объявлении, если это не ослабляет естественное выравнивание типа.

Если самый строгий (наибольший) alignas в объявлении слабее выравнивания, которое было бы у него без спецификаторов alignas (то есть слабее его естественного выравнивания или слабее alignas в другом объявлении того же объекта или типа), программа некорректна:

struct alignas(8) S {};
struct alignas(1) U { S s; }; // error: alignment of U would have been 8 without alignas(1)

Недопустимые ненулевые значения выравнивания, например alignas(3), приводят к некорректной программе.

Допустимые ненулевые значения выравнивания, которые слабее другого alignas в том же объявлении, игнорируются.

alignas(0) всегда игнорируется.

Примечания

Начиная со стандарта ISO C11, язык C содержит ключевое слово _Alignas и определяет alignas как макрос препроцессора, раскрывающийся в это ключевое слово в заголовочном файле <stdalign.h>.

В C++ это ключевое слово, и

заголовочные файлы <stdalign.h> и <cstdalign> не определяют такой макрос. Однако они определяют макроконстанту __alignas_is_defined.

(до C++20)

заголовочный файл <stdalign.h> не определяет такой макрос. Однако он определяет макроконстанту __alignas_is_defined.

(начиная с C++20)

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

alignas

Пример

#include <iostream>

// Every object of type struct_float will be aligned
// to alignof(float) boundary (usually 4):
struct alignas(float) struct_float
{
    // your definition here
};

// Every object of type sse_t will be aligned to 32-byte boundary:
struct alignas(32) sse_t
{
    float sse_data[4];
};

int main()
{
    struct default_aligned
    {
        float data[4];
    } a, b, c;
    sse_t x, y, z;

    std::cout
        << "alignof(struct_float) = " << alignof(struct_float) << '\n'
        << "sizeof(sse_t) = " << sizeof(sse_t) << '\n'
        << "alignof(sse_t) = " << alignof(sse_t) << '\n'
        << std::hex << std::showbase
        << "&a: " << &a << "\n"
           "&b: " << &b << "\n"
           "&c: " << &c << "\n"
           "&x: " << &x << "\n"
           "&y: " << &y << "\n"
           "&z: " << &z << '\n';
}

Возможный вывод:

alignof(struct_float) = 4
sizeof(sse_t) = 32
alignof(sse_t) = 32
&a: 0x7fffcec89930
&b: 0x7fffcec89940
&c: 0x7fffcec89950
&x: 0x7fffcec89960
&y: 0x7fffcec89980
&z: 0x7fffcec899a0

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Корректное поведение
CWG 1437 C++11 alignas можно было использовать в объявлениях псевдонимов запрещено
CWG 2354 C++11 alignas можно было применять к объявлению перечисления запрещено

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
    • 9.12.4 Атрибут зависимости [dcl.attr.depend]
  • Стандарт C++20 (ISO/IEC 14882:2020):
    • 9.12.3 Атрибут зависимости [dcl.attr.depend]
  • Стандарт C++17 (ISO/IEC 14882:2017):
    • 10.6.3 Атрибут зависимости [dcl.attr.depend]
  • Стандарт C++14 (ISO/IEC 14882:2014):
    • 7.6.4 Атрибут зависимости [dcl.attr.depend]
  • Стандарт C++11 (ISO/IEC 14882:2011):
    • 7.6.4 Атрибут зависимости [dcl.attr.depend]

См. также

alignof (C++11) запрашивает требования к выравниванию типа
(оператор)
alignment_of
(C++11)
получает требования к выравниванию типа
(шаблон класса)
Документация по C для _Alignas, alignas

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

Spec-Zone.ru

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