std::aligned_storage
结构提供了至少根据cppreference的 type
typedef:
提供构件类型类型,这是适合使用的podtype 作为任何大小最多的对象的非初始化存储, 其对齐要求是对齐的分隔线。
对齐的默认值是最严格的(最大的) 对所有大小最多的对象的对齐要求。
特别是,具有 Align
的默认值,适合对的任何对象的大小最多为len。
请注意,过度对准类型没有任何警告或例外(在任何情况下,我正在使用的平台,GCC,至少支持一些过度对准的类型)。
这样的实现如何真正起作用?为了满足"任何对象"的要求,它似乎都可以:
- 在
alignof(T) <= sizeof(T)
类型T
的平台上,需要始终与大致与Len
字节对齐,因为大小Len
的对象可以使Len
的对准对准。当然,这会浪费大量的记忆,以使大型Len
! - 在
alignof(T)
可能大于sizeof(T)
的平台上,我根本看不到它如何实现。但是,对我而言,这种类型甚至可以存在。
基于我的测试,对于默认的Align
值,gcc
始终将与16保持一致,而不论LEN如何。这意味着存储是不适合任何的对象,而是基本对齐的对象(此平台上的alignof(max_align_t) == 16
)。
per [meta.trans.other]/2,
是否支持是否支持任何扩展对齐。
当他们在没有指针的情况下在大桌之后指定这样的东西时,这很烦人。我刚刚将句子添加到cppreference中。