43

在 C++11std::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 方文档(像这样)都指出 std::array 与普通数组一样具有内存效率,结合连续要求意味着它必须具有相同的内存布局。但是我在标准中找不到这个要求。

4

1 回答 1

30

几乎是必需的。具体来说,§23.3.2.1/2 说:

数组是可以使用语法初始化的聚合(8.5.1)

array<T, N> a = { initializer-list };

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

由于它是一个聚合,它不能使用任何类型的构造函数将初始化列表中的数据转换为正确的格式。那真的只剩下一种可能性:它唯一可以存储的就是值本身。

我想可以std::array指定数据之后存储某种辅助数据,例如设置为某个预定义值的额外内存,所以如果你写到数组的末尾,你可能会更改该数据。然后编译器/运行时将在关闭时检查这些值,如果您更改了这些值,请报告您的代码的未定义行为。

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

底线:不涉及可能存在多少可能性的问题,很明显std::array不一定必须遵循您所询问的规则。

于 2013-09-30T20:50:49.047 回答