c++ - 在内存中设置的二维数组是否与模拟二维数组的一维数组连续相似?

标签 c++ arrays memcpy

考虑两种类型的数组声明:

T x [rows * cols];  // type 1
T y [rows][cols];   // type 2

我通常使用第一种类型(类型 1)然后我知道使用 x[row * cols + col] 进行索引

但是,如果我想将二维数组复制到模拟二维数组的一维数组中,即:复制 type2 -> type1。如果保证这些在内存中以相同的方式布局,我可以只对另一个进行 memcpy 吗?目前我有一个这样的循环,但如果两者的内存布局相同,我想我可以做一个 memcpy。考虑下面的公共(public)构造函数。

public:
  // construct a matrix from a 2d array
  template <unsigned int N, unsigned int M>
  Matrix ( T (&twoDArray)[N][M]  )  : rows_(N), cols_(M), matrixData_(new T[rows_*cols_]) 
  {
    // is there a refactor here? Maybe to memcpy?
    for ( unsigned int i = 0; i < rows_ ; ++i )
    {
      for ( unsigned int j = 0; j < cols_ ; ++j )
      {
        matrixData_[ i * cols_ + j ] = twoDArray[i][j];
      }
    }
  }

  private:
  unsigned int rows_;
  unsigned int cols_;
  T* matrixData_;

最佳答案

这取决于,但通常编译器会使简单的 T x[rows][columns] 表现得像 T x[rows * columns。除非你像这样动态声明内存

T** x = new T*[rows];
for (int i = 0; i < rows; ++i)
    x[i] = new T[columns];

在这个例子中它们是不同的。

关于c++ - 在内存中设置的二维数组是否与模拟二维数组的一维数组连续相似?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18414196/

相关文章:

c++ - 如何使用 const 成员构造动态数量的类?

ios - 将项目添加到 'Routine' 选项卡中的特定 TableView 部分。每一天都有自己的 list 或例程

ios - 在 Objective-C 中返回 float 组

c++ - C/C++ memcpu 基准测试 : measuring CPU and wall time

c++ - 将类链接到多个其他类

c++ - 如何在qt中包含菜单项的工具提示

javascript - MongoDB 仅返回其他文档中的用户与字段不匹配的文档

size - valgrind - 无效的写入大小

c - memcpy() 从较小的数组到较大的数组

c++ - Boost asio 无法在所有线程上运行 io 服务。io 服务在第一个线程调用时阻塞