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

3lxsmp7m  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(170)

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

eblbsuwk

eblbsuwk1#

这几乎是必需的,具体来说,§ 23.3.2.1/2说:
数组是一个集合(8.5.1),可以使用以下语法进行初始化
数组〈T,N〉a = {初始化器列表};
其中initializer-list是一个逗号分隔的列表,最多包含N个类型可转换为T的元素。
因为它是一个聚合,所以它不能使用任何构造函数来将初始化器列表中的数据转换成正确的格式,这实际上只剩下一种可能性:它唯一能存储的就是值本身。
我想std::array有可能在指定的数据后面存储一些辅助数据,比如设置为某个预定义值的额外内存,所以如果你写的超过了数组的末尾,你可能会改变数据,编译器/运行时会在关闭时检查这些值,如果你改变了这些值,报告你的代码的未定义行为。
编译器也有可能对std::array和内置数组执行不同的填充/对齐。一个明显的例子是支持超级对齐要求,比如Intel的SSE指令使用的数据。内置数组 * 不能 * 支持超级对齐。但我认为std::array的规范可能不够宽松,不允许这样做。
底线:在不考虑可能存在多少种可能性的情况下,很明显std::array不必遵循您所询问的规则。

相关问题