c++ - std::array 的大小是否由标准定义

标签 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 和 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/

相关文章:

c++ - std::move 的用法

c++ - enable_shared_from_this 需要什么?

c++ - 计算无向未加权图的每个连接部分中的节点数

c++ - Linux 上 STL 的安全版本

c++ - push_back() 时出现段错误

c++ - (.eh) 在 nm 输出中意味着什么?

c++ - 从 cryptopp::integer 转换为 QString

c++ - 声明在嵌套范围内初始化的未初始化变量

c++ - Lambda 和通过引用局部变量 : Accessing after the scope 捕获

c++ - 在列表 vector 中的单个/多个列表中添加元素