我想复制几个三维数组的二维子数组(例如array1[n][rows][cols],…, array4[n][rows][cols]),这是动态分配的(但具有固定的长度),成一个1维数组(例如array[4*rows*cols]),这是静态分配的,在c中。因为将有许多行和列(例如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()
可能更糟糕的唯一情况是如果数组元素是指向其他东西的指针。此时,您只是将映射复制到实际数据中,这可能不是您想要的。