在 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 和 Intel)。此外,我能找到的所有第 3 方文档 ( like this ) 都指出 std::array 的内存效率与普通数组一样,结合连续要求意味着它必须具有相同的内存布局。但是我在标准中找不到这个要求。
最佳答案
它几乎是必需的。具体来说,§23.3.2.1/2 说:
An array is an aggregate (8.5.1) that can be initialized with the syntax
array<T, N> a = { initializer-list };
where
initializer-list
is a comma-separated list of up to N elements whose types are convertible to T.
因为它是一个聚合,所以它不能使用任何类型的构造函数将初始化列表中的数据转换为正确的格式。这实际上只剩下一种可能性:它唯一可以存储的是值本身。
我想 std::array
可以在指定数据之后存储某种辅助数据,例如设置为某个预定义值的额外内存,因此如果您写入数组末尾,您可能会更改该数据。编译器/运行时将在关闭时检查这些值,如果您更改了这些值,则报告您的代码的未定义行为。
也有可能编译器可以对 std::array
和内置数组进行不同的填充/对齐。一个明显的例子是支持 super 对齐要求,例如用于 Intel 的 SSE 指令的数据。内置数组不能支持 super 对齐,但我认为 std::array
的规范可能勉强够宽松到允许它。
底线:无需考虑可能存在多少种可能性,很明显 std::array
不一定必须遵循您所询问的规则。
关于c++ - std::array 的大小是否由标准定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24318303/