STD :: Aligned_Storage如何正确对齐任何对象的存储



std::aligned_storage结构提供了至少根据cppreference的 type typedef:

提供构件类型类型,这是适合使用的podtype 作为任何大小最多的对象的非初始化存储, 其对齐要求是对齐的分隔线。

对齐的默认值是最严格的(最大的) 对所有大小最多的对象的对齐要求。

特别是,具有 Align的默认值,适合对的任何对象的大小最多为len。

请注意,过度对准类型没有任何警告或例外(在任何情况下,我正在使用的平台,GCC,至少支持一些过度对准的类型)。

这样的实现如何真正起作用?为了满足"任何对象"的要求,它似乎都可以:

  1. alignof(T) <= sizeof(T)类型T的平台上,需要始终与大致与Len字节对齐,因为大小Len的对象可以使Len的对准对准。当然,这会浪费大量的记忆,以使大型Len
  2. alignof(T)可能大于sizeof(T)的平台上,我根本看不到它如何实现。但是,对我而言,这种类型甚至可以存在。

基于我的测试,对于默认的Align值,gcc始终将与16保持一致,而不论LEN如何。这意味着存储是不适合任何对象,而是基本对齐的对象(此平台上的alignof(max_align_t) == 16)。

per [meta.trans.other]/2,

是否支持是否支持任何扩展对齐。

当他们在没有指针的情况下在大桌之后指定这样的东西时,这很烦人。我刚刚将句子添加到cppreference中。

相关内容

最新更新