是标准定义的std :: array的大小

时间:2013-09-30 20:29:17

标签: c++ c++11 stl language-lawyer

在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&amp; Intel)。此外,我能找到的所有第三方文档(like this)都声明std :: array与普通数组一样具有内存效率,它与连续的需求相结合意味着它必须具有相同的内存布局。但是我在标准中找不到这个要求。

1 个答案:

答案 0 :(得分:26)

几乎需要。具体而言,§23.3.2.1/ 2说:

  

数组是可以使用语法

初始化的聚合(8.5.1)
array<T, N> a = { initializer-list };
  

其中initializer-list是一个逗号分隔的列表,最多包含N个元素,其类型可转换为T.

由于它是聚合,因此无法使用任何类型的构造函数将初始化列表中的数据转换为正确的格式。这真的只留下了一种可能性:它唯一可以存储的是价值本身。

我认为 可能<{1}}可以在指定的数据之后存储某种辅助数据,例如额外的内存设置为某个预定义的值,所以如果你写过去的话在数组结束时,您可能会更改该数据。然后,编译器/运行时将在关闭时检查这些值,如果您更改了值,则报告代码的未定义行为。

编译器也可以std::array进行填充/对齐,而不是对内置数组进行填充/对齐。一个明显的例子就是支持超对齐要求,例如用于英特尔SSE指令的数据。内置数组不能支持超对齐,但我认为 std::array的规范可能几乎不足以允许它。

结论:没有问及可能存在多少种可能性的问题,很明显std::array并不一定要遵循你所要求的规则。