Выровнен ли адрес malloc + size_t * 3 для любого типа?
Нет, поскольку могут быть стандартные типы, которые имеют более высокие требования к выравниванию, чем size_t
.Требование выравнивания стандартного типа будет одним из числа фундаментальных выравниваний , используемых компилятором.
C11 <stddef.h>
определяет стандартный тип max_align_t
, выравнивание которого равнолюбой стандартный тип, поддерживаемый реализацией.(Могут быть расширенные типы, которые требуют большего выравнивания, чем max_align_t
.) C11 также имеет ключевые слова _Alignof
и _Alignas
.
_Alignof
- это оператор, который работает с типом и егорезультат - целочисленное константное выражение, равное требованию выравнивания этого типа в байтах.Наибольшее фундаментальное выравнивание задается _Alignof(max_align_t)
.
Ключевое слово _Alignas
используется в спецификаторах выравнивания как часть объявления, чтобы увеличить требование выравниванияобъявленный объект или член.(Его нельзя использовать для уменьшения требования выравнивания объекта или элемента.) Спецификатор выравнивания имеет одну из следующих форм:
_Alignas
(
имя типа )
_Alignas
(
постоянное выражение )
где константа-выражение указывает требуемое выравнивание в байтах.Первая форма с имя типа эквивалентна _Alignas
(
_Alignof
(
имя типа )
)
.
Вы можете использовать спецификатор выравнивания, чтобы увеличить требование выравнивания первого элемента struct vector
до максимального фундаментального выравнивания следующим образом:
struct vector {
_Alignas(max_align_t)
size_t capacity;
size_t typesize;
size_t size;
};
Посколькупервый элемент struct vector
теперь имеет максимально возможное фундаментальное выравнивание, затем struct vector
в целом имеет такое же требование выравнивания (если только оно не содержит нестандартных типов, для которых требуется расширенное выравнивание ).Если необходимо.компилятор добавляет дополнительное заполнение к концу struct vector
, чтобы обеспечить кратность sizeof(struct vector)
_Alignof(max_align_t)
.