Является ли выделение буфера через new char[sizeof(T)]
гарантией выделение памяти, которая правильно выровнена для типа T
, где все члены T
имеют свою естественную, определенную реализацию, выравнивание (т.е. вы не использовали alignas
, чтобы изменить их выравнивание).
Я видел эту гарантию в нескольких ответах здесь, но я не совсем понимаю, как стандарт достигает этой гарантии. 5.3.4-10 стандарта дает основное требование: по существу new char[]
должен быть выровнен с max_align_t
.
То, что мне не хватает, это бит, который говорит, что alignof(T)
всегда будет правильным выравниванием с максимальным значением max_align_t
. Я имею в виду, это кажется очевидным, но должно ли получившееся выравнивание структуры быть не более max_align_t
? Даже точка 3.11-3 говорит, что расширенные выравнивания могут поддерживаться, поэтому может ли компилятор самостоятельно решить, что класс является перенастраиваемым типом?