в любой реализации, однако.
уктура обеспечиваетstd::aligned_storage
typedef, по крайней мере, в соответствии сtype
cppreferenceПредоставляет тип typedef члена, который представляет собой PODType, подходящий для использования в качестве неинициализированного хранилища для любого объекта, размер которого не превышает Len и требование выравнивания которого является делителем Align.:
Значение по умолчанию Align является самым строгим (самым большим) требованием выравнивания для любого объекта, размер которого не превышает Len.
В частности, со значением по умолчанию
, соответственно выровненный дляAlign
любой объект чей размер не более лен.Обратите внимание, что нет никаких предупреждений или исключений для выровненных типов (и в любом случае платформа, которую я использую, gcc, поддерживает, по крайней мере, некоторые выровненные типы).
Как на самом деле может работать такая реализация? Для удовлетворения требования «любой объект» может показаться, что:
На платформе, где
для типовalignof(T) <= sizeof(T)
, надо всегда соответствовать примерноT
байты, поскольку объект размеромLen
может иметь выравнивание доLen
, Конечно, это будет тратить много памяти для большихLen
На платформе, гдеLen
! может быть больше чемalignof(T)
Я не понимаю, как это вообще может быть реализовано. Тем не менее, это неsizeof(T)
ясно для меня что такой тип может даже существовать.На основемое тестированиепо умолчанию ценности,Align
просто всегда выравнивается до 16, независимо от длины Это означает, что хранилищеgcc
не подходит дляЛюбые объект, но только объекты фундаментального выравнивания ( на этой платформе).alignof(max_align_t) == 16
в