C++ std::array的std::array是否具有连续内存?

C++ std::array的std::array是否具有连续内存?,c++,arrays,matrix,memory,allocation,C++,Arrays,Matrix,Memory,Allocation,似乎,我发现了如何在两行代码中轻松获得具有连续内存的普通2D数组: template<int N, int M> using Array2D = array<array<int, M>, N>; 我在Visual Studio 2017中获得了下一个结果: 41 67 34 0 69 24 78 58 62 64 5 45 81 27 61 91 95 42 27 36 91 4 2 53 92 Swap minimum and

似乎,我发现了如何在两行代码中轻松获得具有连续内存的普通2D数组:

template<int N, int M>
using Array2D = array<array<int, M>, N>;
我在Visual Studio 2017中获得了下一个结果:

 41 67 34  0 69

 24 78 58 62 64

  5 45 81 27 61

 91 95 42 27 36

 91  4  2 53 92

Swap minimum and maximum: 0 95

 41 67 34 95 69

 24 78 58 62 64

  5 45 81 27 61

 91  0 42 27 36

 91  4  2 53 92
优点:

  • 只有2条简单的线才能得到二维数组
  • 您通常可以通过
    arr[2][2]
  • 您可以使用stl算法
缺点:

  • 此解决方案在调试模式下无法正常工作,我发现运行时错误
    数组迭代器不兼容
  • 我不知道内存是否总是连续分配的
  • 我不知道它是否适用于其他编译器
  • 魔术迭代器
问题:

  • Array2D
    的连续分配是否有任何保证
  • 以这种方式使用数组迭代器是否合格?(不同的迭代器,但请记住指针上的连续和实现)
  • Array2D
    在生产代码中以这种方式使用(如示例所示)安全吗?如果没有,您能否以最小的代码开销提供解决此任务的好代码
  • :这与嵌套数组的连续性相矛盾。也许C++14中发生了一些变化

根据标准,内存应该是连续的。该段指出(我的重点):

标头定义用于存储固定大小的类模板 对象序列。数组是一个连续的容器。实例 of数组存储N个类型为T的元素,因此size()==N是 不变量

更新:似乎实现可能包括填充。 有关该主题的更多信息,请参见这些SO帖子:

特别是这个答案:

内存将是连续的,但在
生成中(arr.front().begin(),arr.back().end())
您在两个不同的容器中使用迭代器,这是不允许的。您绝对不允许将其视为int的连续数组,但我非常确定连续内存布局是有保证的。@Boperson,是的,迭代器的概念是错误的,但
\u数组\u迭代器
在指针上工作,所以它似乎不是这段代码是否因为迭代器的概念而不可接受?内存是连续的,但元素不需要连续(因为填充),因此混合来自不同数组元素的迭代器是未定义的行为(就像使用实际指针一样).Ha的可能重复,非常简单。
array
连续放置N个连续的
array
块,共M个元素,但由于某些原因,我害怕Array2D将是连续的。谢谢。关于迭代器的问题left@MrPisarik:这是矛盾的。也许C++14中有些东西已经改变了?@Ron:我保证f在
std::array
的末尾没有填充。我不知道标准是怎么说的。但是我打赌一个健全的实现不会在那里做任何填充(但是如果标准不禁止的话,这种可能性仍然存在)。问题是每个单独的数组都有连续的内容,但不同的
std::array
元素之间的间隙未定义。因此数组的连续性充其量是“块状的”。@geza A
std::array
可以在末尾加上填充。
 41 67 34  0 69

 24 78 58 62 64

  5 45 81 27 61

 91 95 42 27 36

 91  4  2 53 92

Swap minimum and maximum: 0 95

 41 67 34 95 69

 24 78 58 62 64

  5 45 81 27 61

 91  0 42 27 36

 91  4  2 53 92