为什么 std::aligned_union 需要最小尺寸作为模板参数?

rub*_*nvb 5 c++11

std::aligned_union有一个std::size_t“最小长度”参数。现在,通常的工会没有这个,所以我想知道为什么这是必要的。有人可以向我解释为什么吗?

MSa*_*ers 1

相关论文似乎是N2140。从根本上来说,原因是您可以过度对齐类型。给出的例子是你可以制作一个页面对齐的数据结构。

(我首先将aligned_storage和aligned_union混淆了,抱歉)。

Aligned_storage 在N2140 中被描述为aligned_union 的可能基类。aligned_storage<N, ...>N2140 还描述了(但不强制要求)作为对齐的扭曲器的点的实现char[N]。显然你需要N。

因为它是一种不平凡的平凡类型;)

std::aligned_union是至少具有给定大小和每个指定类型的对齐方式的 POD 类型。这些类型不必是 POD 类型,从这里可以看出它们不能是成员。

但是,您可以做的是使用placement new将a放入T[n]该存储中,前提是aligned_union已对齐T并且其大小至少为sizeof(T[n])