我想复制几个三维数组的二维子数组(例如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维)。那么,是否有更好的方法来做到这一点?
答案 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()
可能更糟糕的唯一情况是你的数组元素是指向别的东西的指针。此时,您只会将地图复制到实际数据,这可能不是您想要的。