Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp‎ | language

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

Содержание

[править] Синтаксис

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

[править] Объяснение

Спецификатор alignas может быть применен к объявлению переменной или члена-данного класса, не являющегося битовым полем, или может быть применен к объявлению или описанию класса/структуры/объединения или перечисления. Спецификатор alignas не может быть применен к параметру функции или к параметру исключения для catch-обработчика.

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

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

struct alignas(8) S {};
struct alignas(1) U { S s; }; // ошибка: без alignas(1) выравнивание U было бы 8 байтов

Ненулевые требования по выравниванию, такие как alignas(3), не удовлетворяют правилам и являются неправильными.

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

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

[править] Примечания

Согласно стандарту ISO C11, в языке C есть ключевое слово _Alignas и в <stdalign.h> определён макрос препроцессора alignas, раскрывающийся в это ключевое слово, но в C++ alignas - ключевое слово, а в заголовочных файлах <stdalign.h> и <cstdalign> этот макрос не определён. Однако, там определена макро-константа __alignas_is_defined.

[править] Ключевые слова

alignas

[править] Пример

// каждый объект типа sse_t будет выравнен на границе 16 байтов
struct alignas(16) sse_t
{
    float sse_data[4];
};
 
// массив "cacheline" будет выравнен на границе 128 байтов
alignas(128) char cacheline[128];
 
 
int main()
{
}



[править] Смотри также

alignof operator queries alignment requirements of a type (начиная с C++11) [править]
Получает требования к выравниванию типа
(шаблон класса) [править]