【问题标题】:How can std::aligned_storage expose correctly aligned storage for any object?std::aligned_storage 如何为任何对象公开正确对齐的存储?
【发布时间】:2018-03-09 12:04:36
【问题描述】:

std::aligned_storage 结构提供了一个type 类型定义,至少根据cppreference

提供成员typedef type,是一个适合使用的PODType 作为大小最多为 Len 的任何对象的未初始化存储,并且 其对齐要求是 Align 的除数。

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

特别是,在默认值Align 的情况下,对于大小最多为 Len 的任何对象进行适当对齐。

请注意,过度对齐的类型没有警告或例外(无论如何我使用的平台 gcc 至少支持一些过度对齐的类型)。

这样的实现如何实际工作?为了满足“任何对象”的要求,它似乎可以:

  1. alignof(T) <= sizeof(T) 类型T 的平台上,需要始终大致对齐Len 字节,因为大小为Len 的对象最多可以对齐Len。当然,对于大Len,这会浪费大量内存!
  2. alignof(T) 可能大于sizeof(T) 的平台上,我根本看不出它是如何实现的。但是,clear to me 甚至不可能存在这样的类型。

基于my testing,对于默认的Align 值,gcc 总是与 16 对齐,而与 len 无关。这意味着存储适合任何对象,而只适合基本对齐的对象(此平台上的alignof(max_align_t) == 16)。

【问题讨论】:

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


    【解决方案1】:

    [meta.trans.other]/2

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

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

    【讨论】:

    • 所以脚注“2”不会出现在文本中的任何地方,对吧?奇怪的是,GCC 通常确实支持至少 128 的扩展对齐,但这里不支持。但是,我想在任何实现中都没有限制扩展对齐支持一致
    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 2019-10-08
    • 1970-01-01
    • 2018-07-08
    • 2016-08-07
    • 2013-08-28
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多