为什么 std::array<T,0> 根据 libc++ 中的 T 调整大小和对齐?

Dan*_*ica 16 c++ libc++ stdarray

在 libc++ 中, 的特化std::array<T,0>有一个成员 ( const)char数组,该数组根据T() 进行对齐和调整大小。我想知道这个实现的原因是什么,因为这个成员(__elems_)似乎没有在任何地方使用。为了进行比较,libstdc++使用空成员,而Microsoft STL如果不可默认构造则使用空成员T(否则,它会创建单元素数组)。

差异的现场演示:https ://godbolt.org/z/1o167na6z

Ala*_*les 10

std::array允许具有零大小,但底层 c 数组不能为零大小。因此,实现需要一些特殊情况来处理这个问题。

该标准没有指定这个实现必须是什么,也没有对行为、调用front()back()未定义的行为施加许多限制。有一个限制,即array.begin() == array.end(). 由于没有太多限制,您会期望不同的实现使用不同的解决方法。

Libc++ 最初使用单元素数组,但这不适用于非默认可构造类型。为了保持 ABI 兼容性,它被替换char相同大小的数组。

  • @PasserBy 单个分配的字节比“sizeof(T)”字节(具有额外的可能填充)更具(内存)效率。 (2认同)