Самый быстрый способ скопировать несколько двумерных массивов в один одномерный массив (в C)

Я хочу скопировать несколько двумерных подмассивов трехмерных массивов (например, array1 [n] [rows] [cols], …, array4 [n] [rows] [cols]), которые динамически распределены (но с фиксированная длина), в 1-мерный массив (например, массив [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. Таким образом, клиенты будут делать выше, а мастер (вид) наоборот – то есть одномерный -> 2-мерный). Итак, есть ли лучший способ сделать это в целом?

Предположим, что линейные массивы и те же размеры (что лишит меня моего ответа):

это

 for(i=0;i 

может быть заменено на:

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

Соответственно, этот:

 for(i=0;i 

будет:

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

C указывает, что массивы хранятся в строчном порядке , поэтому каждый i упаковывающий каждый j (и каждый j wrapping каждый k и т. Д.), Будет быстрее, чем альтернатива из-за « локальности ссылки ».

Однако, как упоминалось в комментариях, memcpy() будет копировать все пространство линейно, игнорируя порядок. Таким образом, это почти наверняка не хуже, и будет гораздо проще поддерживать прямую связь, имея только один звонок. Просто не забудьте использовать sizeof() чтобы получить размер массива как сохраненный, так как фактическое хранилище может быть больше, чем только rows*cols .

Единственный случай, когда memcpy() может быть хуже, – если ваши элементы массива являются указателями на что-то другое. В этот момент вы только копируете карту в реальные данные, которые могут быть не такими, какие вы хотите.