将嵌套的std :: arrays视为具有链式.data()的单个平面数组

时间:2018-05-22 16:21:26

标签: c++ c++11

假设我有这个小的固定维矩阵类:

template<size_t M, size_t N>
struct MatMN { 
  std::array<std::array<double, N>, M> rows;
  double* begin() { return rows.data()->data(); } //The scary part
  double* end() { return begin() + M*N; }
  //const iterators, etc.
};

而不是使用嵌套循环,我实现了标量乘法(也是等式测试,二进制序列化/序列化等),如下所示:

template<size_t M, size_t N>
MatMN<M, N> operator*(double scalar, MatMN<M, N> mat) {
  for (double& x_ : mat) { x_ *= scalar; }
  return mat;
}

使用std::array将嵌套的.data()->data()作为单个扁平C风格的数组处理是否真的可以?

我是否有过一些严格别名问题的风险?或者在个别std::array的末尾(即矩阵行之间)可能出现意外的结构填充?到目前为止,它对我来说很好(使用GCC),但我知道这在C ++中并不重要。

1 个答案:

答案 0 :(得分:3)

  

使用.data() - &gt; data()?将嵌套的std :: arrays视为单个扁平的C风格数组是否可行?

没有。 std::array允许在末尾填充。这意味着在一个数组结束而另一个数组从嵌套结构开始的位置之间可能存在间隙。像你那样得到一个指针(如果填充在那里)将导致你访问该填充,给你不明确的结果。

您应该只使用1d std::array,而不是将矩阵存储在2d std::array中。这样你就可以保证元素在内存中彼此相邻。