猿问

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

在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)中工作。此外,我可以找到的所有第三方文档(像这样)都指出std :: array与普通数组一样具有高效的内存,再加上连续的要求,则意味着它必须具有相同的内存布局。但是我在标准中找不到此要求。


倚天杖
浏览 672回答 2
2回答

芜湖不芜

它几乎需要。具体而言,第23.3.2.1/2节说:数组是一个聚合(8.5.1),可以使用以下语法初始化array<T, N> a = { initializer-list };其中initializer-list是逗号分隔的列表,其中包含最多N个元素,其类型可转换为T。由于它是一个聚合,因此不能使用任何类型的构造函数将初始化列表中的数据转换为正确的格式。这实际上仅留下一种可能性:它唯一可以存储的是值本身。我想一个可能会std::array在指定的数据之后存储某种辅助数据,例如将额外的内存设置为某个预定义的值,因此,如果您在数组末尾进行写操作,则可能会更改该数据。然后,编译器/运行时将在关闭时检查这些值,如果您更改了这些值,请报告代码的未定义行为。它也可能是一个编译器可以用于做填充/对齐不同std::array比内置阵列。一个甚至可能需要这样做的明显例子是支持超对齐要求,例如与Intel SSE指令一起使用的数据。内置数组不支持超对齐,但是我认为的规范std::array可能不够宽松。底线:在不考虑可能存在多少可能性的问题的情况下,很明显std::array不必一定要遵循您所要求的规则。

莫回无

实时示例(是的,这没有什么证明。我仔细搜索了Standard,没有发现任何聚合或文字类型的布局要求,仅是标准布局类型;以前的POD在C ++ 03中具有这些要求。&nbsp;
随时随地看视频慕课网APP
我要回答