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