将几个二维数组复制到一个一维数组中的最快方法(在C中)

时间:2014-03-20 18:09:56

标签: c arrays optimization multidimensional-array

我想复制几个三维数组的二维子数组(例如array1 [n] [rows] [cols],...,array4 [n] [rows] [cols]),它们是动态分配的(但是具有固定的长度),在C中静态分配的一维数组(例如数组[4 * rows * cols])。因为将有许多行和列(例如10000行和500列),我想知道以下三种可能性中哪一种最快:

    for(i=0;i<rows;i++){
      for(j=0;j<cols;j++){
        array[i*cols+j]=array1[2][i][j];
      }
    }
    ...
    for(i=0;i<rows;i++){
      for(j=0;j<cols;j++){
        array[3*rows*cols+i*cols+j]=array4[2][i][j];
        }
    }

    for(i=0;i<rows;i++){
      for(j=0;j<cols;j++){
        array[i*cols+j]=array1[2][i][j];
      }
      ...
      for(j=0;j<cols;j++){
        array[3*rows*cols+i*cols+j]=array4[2][i][j];
      }
    }

    for(i=0;i<rows;i++){
      for(j=0;j<cols;j++){
        array[i*cols+j]=array1[2][i][j];
        ...
        array[3*rows*cols+i*cols+j]=array4[2][i][j];
      }
    }

或者是否有更快的方法在C(而不是C ++)中执行此任务?

非常感谢! (我认为应该有一个类似的问题,但遗憾的是我找不到我想要的东西。所以,如果我错过了这样的问题,我很抱歉。)

编辑: 想要这样做的原因如下:存储在那些二维(子)阵列中的信息必须通过MPI进行通信。因此,客户将完成上述操作并且主要(种类)反过来(即1维 - > 2维)。那么,是否有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

假设线性数组和相同的维度(这会使我的答案无效):

for(i=0;i<rows;i++) {
  for(j=0;j<cols;j++) {
    array[i*cols+j]=array1[2][i][j];
  }
}

可以替换为:

memcpy(array, array1[2], sizeof(array1[2]));

据此:

for(i=0;i<rows;i++) {
  for(j=0;j<cols;j++) {
    array[3*rows*cols+i*cols+j]=array4[2][i][j];
  }
}

将是:

memcpy(array + 3*cols*rows, array4[2], sizeof(array4[2]));

答案 1 :(得分:0)

C指定数组存储在row-major order中,因此每个i包裹每个j(每个j包裹每个k,依此类推)由于“locality of reference”会比替代方案更快。

但是,如评论中所述,memcpy()将线性复制整个空间,忽略排序。所以,它几乎肯定不会更糟,只用一个电话就可以更容易保持直线。请确保使用sizeof()来获取存储的数组大小,因为实际存储空间可能大于rows*cols

memcpy() 可能更糟糕的唯一情况是你的数组元素是指向别的东西的指针。此时,您只会将地图复制到实际数据,这可能不是您想要的。