Namespaces
Variants

alignas specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

Содержание

Синтаксис

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

Объяснение

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

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

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

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

struct alignas(8) S {};
struct alignas(1) U { S s; }; // ошибка: выравнивание U было бы 8 без 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>
// Каждый объект типа struct_float будет выровнен
// по границе alignof(float) (обычно 4):
struct alignas(float) struct_float
{
    // ваше определение здесь
};
// Каждый объект типа sse_t будет выровнен по 32-байтной границе:
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 Applied to Behavior as published Correct behavior
CWG 1437 C++11 alignas could be used in alias declarations prohibited
CWG 2354 C++11 alignas could be applied to the declaration of an enumeration prohibited

Ссылки

  • Стандарт 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) запрашивает требования к выравниванию типа
(оператор)
получает требования к выравниванию типа
(шаблон класса)
документация C для _Alignas, alignas