Spec-Zone.ru › C++

alignas спецификатор (с C++11)

Определяет требование выравнивания типа или объекта.

Синтаксис

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

Объяснение

Спецификатор alignas может быть применён к:

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

Объект или тип, объявленные таким образом, будут иметь требование выравнивания, равное самому строгому (наибольшему) ненулевому выражению всех спецификаторов 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];
};
 
// the array "cacheline" will be aligned to 64-byte boundary:
alignas(64) char cacheline[64];
 
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'
        << "alignof(cacheline) = " << alignof(alignas(64) char[64]) << '\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
alignof(cacheline) = 64
&a: 0x7fffcec89930
&b: 0x7fffcec89940
&c: 0x7fffcec89950
&x: 0x7fffcec89960
&y: 0x7fffcec89980
&z: 0x7fffcec899a0

Отчёты о дефектах

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

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

См. также

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/w/cpp/language/alignas

Spec-Zone.ru

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