std :: aligned_storage结构提供的typedef类型至少与cppreference相符:
Provides the member typedef type, which is a PODType suitable for use
as uninitialized storage for any object whose size is at most Len and
whose alignment requirement is a divisor of Align.The default value of Align is the most stringent (the largest)
alignment requirement for any object whose size is at most Len.
特别是,使用默认值Align时,适合大小最大为Len的任何对象.
请注意,对于过度对齐的类型(在任何情况下,我正在使用的平台gcc,至少都支持某些过度对齐的类型)没有任何警告或例外.
这样的实现实际上如何工作?为了满足“任何对象”的要求,似乎可以:
>在类型T的alignof(T)< = sizeof(T)的平台上,由于大小为Len的对象可能具有最大Len的对齐方式,因此必须始终将其大致对齐到Len字节.当然,这会浪费大Len的大量内存!
>在alignof(T)可能大于sizeof(T)的平台上,我完全看不到如何实现.但是,这种类型甚至可以存在的并不是clear to me.
基于my testing,对于默认的Align值,无论len为何,gcc都始终总是对齐16.这意味着该存储不适用于任何对象,仅适用于基本对齐的对象(此平台上的alignof(max_align_t)== 16).
解决方法:
It is implementation-defined whether any extended alignment is supported.
当他们在没有指针的大表之后指定这样的内容时,这很烦人.我刚刚将句子添加到cppreference中.