std :: aligned_storage如何为任何对象公开正确对齐的存储?

时间:2017-09-27 21:19:19

标签: c++ c++11 memory-management alignment

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

  

提供成员typedef类型,它是适合使用的PODType   作为任何大小最多为Len和的对象的未初始化存储空间   其对齐要求是Align的除数。

     

Align的默认值是最严格的(最大的)   任何大小最多为Len的对象的对齐要求。

特别是,使用默认值Align,适当地对齐任何对象,其大小最多为Len。

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

这样的实施如何实际运作?满足"任何对象的要求"它似乎会:

  1. alignof(T) <= sizeof(T)类型T的平台上,需要始终与大约Len个字节对齐,因为大小为Len的对象可以对齐Len。当然,这会为大Len
  2. 浪费大量内存
  3. alignof(T)可能大于sizeof(T)的平台上,我根本不知道如何实施。{li>但是,这种类型甚至不存在clear to me
  4. 基于my testing,对于默认Align值,gcc总是与16对齐,而不管len。这意味着存储适用于任何对象,但只适用于基本对齐的对象(此平台上为alignof(max_align_t) == 16)。

1 个答案:

答案 0 :(得分:2)

[meta.trans.other]/2

  

是否支持任何扩展对齐,是实现定义的。

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