【发布时间】:2018-03-09 12:04:36
【问题描述】:
std::aligned_storage 结构提供了一个type 类型定义,至少根据cppreference:
提供成员typedef type,是一个适合使用的PODType 作为大小最多为 Len 的任何对象的未初始化存储,并且 其对齐要求是 Align 的除数。
Align的默认值是最严格的(最大的) 大小最大为 Len 的任何对象的对齐要求。
特别是,在默认值Align 的情况下,对于大小最多为 Len 的任何对象进行适当对齐。
请注意,过度对齐的类型没有警告或例外(无论如何我使用的平台 gcc 至少支持一些过度对齐的类型)。
这样的实现如何实际工作?为了满足“任何对象”的要求,它似乎可以:
- 在
alignof(T) <= sizeof(T)类型T的平台上,需要始终大致对齐Len字节,因为大小为Len的对象最多可以对齐Len。当然,对于大Len,这会浪费大量内存! - 在
alignof(T)可能大于sizeof(T)的平台上,我根本看不出它是如何实现的。但是,clear to me 甚至不可能存在这样的类型。
基于my testing,对于默认的Align 值,gcc 总是与 16 对齐,而与 len 无关。这意味着存储不适合任何对象,而只适合基本对齐的对象(此平台上的alignof(max_align_t) == 16)。
【问题讨论】:
标签: c++ c++11 memory-management alignment