В C ++ 17 есть два уровня переопределенных типов: расширенный и новый расширенный. std::max_align_t
определяет наибольшее выравнивание, которое не расширено, а __STDCPP_DEFAULT_NEW_ALIGNMENT__
определяет наибольшее выравнивание, которое не является новым расширением.
Новое расширенное выравнивание, как следует из названия, касается выравнивания вещей, которые вы выделяете с помощью new
.
Как правило, обычный operator new
возвращает память, подходящую для любого объекта вплоть до нового расширенного размера выравнивания. Любое большее выравнивание предпочитает использовать перегрузки operator new
, которые определяют выравнивание создаваемого типа. И, конечно же, они условно поддерживаются так же, как и переопределенные типы в целом. То же самое касается вызовов operator delete
для уничтожения памяти, связанной с такими типами.
Что говорит Visual Studio, так это то, что максимальное выравнивание, которое не считается перегруженным, составляет 8 байтов, а выравнивание для памяти, выделенной operator new
, составляет 16 байтов.
Это означает, что при отмене операторов new
вы вынуждены выравнивать все по крайней мере на 16 байтах, даже если 8 байтов будет достаточно.
По сути, да. Нет способа запросить, чтобы реализация сообщала вам, какое выравнивание запрашивается с необработанными operator new/delete
перегрузками.
Теперь вы можете, по-отдельности, перегрузить operator new
этого объекта, чтобы напрямую вызвать специфичное для выравнивания operator new
. Но вы не можете заставить компилятор сделать это.