繁体   English   中英

将多个2维数组复制到1维数组中的最快方法(用C语言表示)

[英]Fastest way to copy several 2-dimensional arrays into one 1-dimensional array (in C)

我想复制3维数组的几个2维子数组(例如array1 [n] [rows] [cols],...,array4 [n] [rows] [cols]),这些子数组是动态分配的(但带有固定长度),放入C中静态分配的一维数组(例如array [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维)进行上述操作,并完成主操作。 因此,是否有更好的方法可以整体上做到这一点?

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

这个

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]));

C指定数组以行优先顺序存储,因此由于“ 引用局部性 ”,每个i包裹每个j (每个j包裹每个k ,依此类推)将比替代数组更快。

但是,如注释中所述, memcpy()将线性复制整个空间,而忽略顺序。 因此,几乎可以肯定,情况不会更糟,只需打一个电话就能保持顺畅。 只需确保使用sizeof()来获取存储的数组的大小,因为实际的存储空间可能会比仅仅是rows*cols

memcpy() 可能更糟的唯一情况是,如果数组元素是指向其他内容的指针。 那时,您将只将地图复制到真实数据,而这可能并不是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM