10 Declarations [dcl.dcl]

10.6 Attributes [dcl.attr]

10.6.2 Alignment specifier [dcl.align]

alignment-specifier Может быть применена к переменной или к элементу данных класса, но оно не должно быть применено к битовое поле, параметр функции или exception-declaration([except.handle]). Также alignment-specifierможет применяться к объявлению или определению класса (в elaborated-type-specifierили class-head, соответственно) и к объявлению или определению перечисления (в opaque-enum-declarationили enum-head, соответственно ([dcl.enum])). alignment-specifierМноготочием является pack expansion.

Когда alignment-specifierимеет форму :alignas( constant-expression )

  • constant-expressionявляется неотъемлемой константным выражением

  • если постоянное выражение не оценивается как значение выравнивания ([basic.align]) или оценивается как расширенное выравнивание, а реализация не поддерживает это выравнивание в контексте объявления, программа имеет неправильный формат.

Элемент alignment-specifierформы имеет тот же эффект, что и ( ).alignas( type-id ) alignas(​alignof( type-id )) [expr.alignof]

Требование выравнивания объекта - это строжайшее ненулевое выравнивание, указанное в нем alignment-specifiers, если таковое имеется; в противном случае alignment-specifiers не действуют.

Комбинированный эффект all alignment-specifiers в объявлении не должен указывать менее строгое выравнивание, чем выравнивание, которое потребовалось бы для объявляемого объекта, если бы все, alignment-specifiers относящееся к этому объекту, было опущено. [Example:

struct alignas(8) S {};
struct alignas(1) U {
  S s;
};  // error: U specifies an alignment that is less strict than if the alignas(1) were omitted.

end example]

Если определяющее объявление объекта имеет alignment-specifier, любое не определяющее объявление этого объекта должно либо указывать эквивалентное выравнивание, либо не иметь alignment-specifier. И наоборот, если какое-либо объявление объекта имеет alignment-specifier, каждое определяющее объявление этого объекта должно указывать эквивалентное выравнивание. Диагностика не требуется, если объявления объекта имеют alignment-specifiers разные единицы перевода. [Example:

// Translation unit #1:
struct S { int x; } s, *p = &s;

// Translation unit #2:
struct alignas(16) S;           // error: definition of S lacks alignment, no diagnostic required
extern S* p;

end example]

[ Example: Выровненный буфер с требованием выравнивания A и содержащими N элементы типа T может быть объявлен как:

alignas(T) alignas(A) T buffer[N];

Указание alignas(T) гарантирует, что окончательное запрошенное выравнивание не будет слабее alignof(T), и, следовательно, программа не будет плохо сформирована. ]end example

[Example:

alignas(double) void f();                           // error: alignment applied to function
alignas(double) unsigned char c[sizeof(double)];    // array of characters, suitably aligned for a double
extern unsigned char c[sizeof(double)];             // no alignas necessary
alignas(float)
  extern unsigned char c[sizeof(double)];           // error: different alignment in declaration

end example]