6 Basic concepts [basic]

6.11 Alignment [basic.align]

Типы объектов имеют alignment requirements ([basic.fundamental], [basic.compound]), которые накладывают ограничения на адреса, по которым может быть размещен объект этого типа. An alignment - это определяемое реализацией целочисленное значение, представляющее количество байтов между последовательными адресами, по которым может быть размещен данный объект. Тип объекта налагает требование выравнивания на каждый объект этого типа; более строгое выравнивание можно запросить с помощью alignment specifier.

A fundamental alignment представлен выравниванием, меньшим или равным наибольшему выравниванию, поддерживаемому реализацией во всех контекстах, которое равно alignof(std​::​max_­align_­t) ([support.types]). Выравнивание, необходимое для типа, может быть различным, когда он используется как тип полного объекта и когда он используется как тип подобъекта. [Example:

struct B { long double d; };
struct D : virtual B { char c; };

Когда D это тип полного объекта, у него будет подобъект типа B, поэтому он должен быть соответствующим образом выровнен для объекта long double. Если D подобъект отображается как подобъект другого объекта, который также имеет B виртуальный базовый класс, B подобъект может быть частью другого подобъекта, что снижает требования к выравниванию D подобъекта. ] Результат оператора отражает требование выравнивания типа в случае полного объекта.end example alignof

extended alignment Представлен в большей согласованности , чем alignof(std​::​max_­align_­t). Это определяется реализацией, поддерживаются ли какие-либо расширенные выравнивания и контексты, в которых они поддерживаются ([dcl.align]). Тип, требующий расширенного выравнивания, - это over-aligned type. [ Note: Каждый сверхвыровненный тип является или содержит тип класса, к которому применяется расширенное выравнивание (возможно, через нестатический член данных). ] A представлен выравниванием больше чем .end note new-extended alignment _­_­STDCPP_­DEFAULT_­NEW_­ALIGNMENT_­_­

Выравнивания представлены как значения типа std​::​size_­t. Допустимые выравнивания включают только те значения, которые возвращаются alignof выражением для основных типов, плюс дополнительный набор значений, определяемый реализацией, который может быть пустым. Каждое значение выравнивания должно быть неотрицательной интегральной степенью двойки.

Выравнивания имеют порядок от weaker до stronger или stricter выравнивания. Более строгие выравнивания имеют более высокие значения выравнивания. Адрес, который удовлетворяет требованию выравнивания, также удовлетворяет любому более слабому действительному требованию выравнивания.

Требование выравнивания полного типа можно запросить с помощью файла alignof expression. Кроме того, они narrow character types должны иметь самые слабые требования к выравниванию. [ Note: Это позволяет использовать узкие типы символов в качестве базового типа для выровненной области памяти ([dcl.align]). ]end note

Сравнение выравниваний имеет смысл и дает очевидные результаты:

  • Два выравнивания равны, если их числовые значения равны.

  • Два выравнивания различаются, если их числовые значения не равны.

  • Когда выравнивание больше другого, это означает более строгое выравнивание.

[ Note: Среда выполнения pointer alignment function может использоваться для получения выровненного указателя в буфере; шаблоны выровненного хранилища в библиотеке ([meta.trans.other]) можно использовать для получения выровненного хранилища. ]end note

Если запрос на конкретное расширенное выравнивание в конкретном контексте не поддерживается реализацией, программа плохо сформирована.