【发布时间】:2013-10-06 20:22:32
【问题描述】:
在 C++11 中,std::array 被定义为具有不比数组差的连续存储和性能,但我无法确定标准的各种要求是否意味着 std::array 具有相同的大小和内存布局作为普通数组。那就是你可以指望sizeof(std::array<int,N>) == sizeof(int)*N 还是那个特定的实现?
特别是,这是否保证按您期望的方式工作:
std::vector< std::array<int, N> > x(M);
typedef (*ArrayPointer)[N];
ArrayPointer y = (ArrayPointer) &x[0][0];
// use y like normal multidimensional array
它适用于我尝试过的两个编译器(GNU 和英特尔)。此外,我能找到的所有第 3 方文档 (like this) 都指出 std::array 与普通数组一样具有内存效率,结合连续要求意味着它必须具有相同的内存布局。但是我在标准中找不到这个要求。
【问题讨论】:
-
23.3.2 Class template array中没有这样的保证,事实上,搜索sizeof的标准似乎只会为我找到以下保证:char及其变体是1,nullptr的 sizeof 与void*相同。 -
正如@us2012 所说,没有明确的保证。虽然它可能在您选择的平台上运行,但在具有不同对齐约束的其他平台上可能会失败。
-
我想您可以简单地将代码中所有类型的
static_assert(sizeof(std::array<T,N>) == sizeof(T)*N)用作异常库实现的绊线(或导致std::array以不同方式对齐的某些对齐选项)。如果大小相等,则布局必须相同。
标签: c++ c++11 stl language-lawyer