¿Cómo puede std :: lined_storage exponer el almacenamiento correctamente alineado para cualquier objeto?

losstd::aligned_storage estructura proporciona untype typedef que al menos segúncppreference:

Proporciona el tipo typedef del miembro, que es un PODType adecuado para su uso como almacenamiento no inicializado para cualquier objeto cuyo tamaño sea como máximo Len y cuyo requisito de alineación sea un divisor de Align.

El valor predeterminado de Alinear es el requisito de alineación más estricto (el más grande) para cualquier objeto cuyo tamaño sea como máximo Len.

En particular, con el valor predeterminado deAlign, el adecuadamente alineado paracualquier objeto cuyo tamaño es como máximo Len.

Tenga en cuenta que no hay advertencias ni excepciones para los tipos sobrealineados (y, en cualquier caso, la plataforma que estoy usando, gcc, admite al menos algunos tipos sobrealineados).

¿Cómo puede tal implementación realmente funcionar? Para satisfacer el requisito de "cualquier objeto", parecería que:

En una plataforma dondealignof(T) <= sizeof(T) para tiposT, necesita alinearse siempre aproximadamenteLen bytes, ya que un objeto de tamañoLen podría tener una alineación de hastaLen. Por supuesto, esto desperdiciaría mucha memoria para grandesLen!En una plataforma dondealignof(T) puede ser mayor quesizeof(T), No veo cómo podría implementarse en absoluto. Sin embargo, no lo esclaro para mi que tal tipo incluso puede existir.

Residencia enmi prueba, por defectoAlign valores,gcc simplemente siempre se alinea a 16, independientemente de len. Esto significa que el almacenamiento esno adecuado paraalguna objeto, pero solo objetos de alineación fundamental (alignof(max_align_t) == 16 en esta plataforma).

Respuestas a la pregunta(1)

Su respuesta a la pregunta