alignas спецификатор (с C++11)
Определяет требование выравнивания типа или объекта.
Синтаксис
alignas( выражение ) | ||
alignas( тип-идентификатор ) | ||
alignas( упаковка ... ) |
alignas(alignof(type-id)).Объяснение
Спецификатор 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++, это ключевое слово, и
| заголовки | (до C++20) |
| заголовок | (с C++20) |
Ключевые слова
Пример
#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) | запрос требований выравнивания типа |
|
(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