Эффективное копирование массивов
Предположим, Вы хотите скопировать содержимое
одного двумерного массива в другой:
int weekly_hours[5][5]; // первый
int another_array[5][5]; // второй
Можно просто использовать вложенный цикл,
чтобы скопировать каждый элемент weekly_hours в
another_array, как показано в примере:
for (int i = 0; i<5; i++)
{
for (int j = 0; j < 5; j++)
{
second_array[i][j] = weekly_hours[i][j];
}
}
Однако, эта методика является чрезвычайно
неэффективной. Программа проходит через каждый
элемент массива, проверя условия и увеличивая
счётчики. К счастью, есть намного более
эффективный способ проделать данную операцию.
Как C так C++ гарантируют, что элементы многомерных
массивов занимают непрерывные адреса памяти.
Другими словами, расположение в памяти weekly_hours
идентично расположению в памяти массива в 25
целых чисел. Почему бы не воспользоваться данным
фактом и не скопировать один многомерный массив
на другой за один раз ? Для этого достаточно
воспользоваться стандартной функцией memcpy():
memcpy(second_array, weekly_hours, sizeof(second_array));
memcpy() объявлена в заголовочном файле <string.h>
следующим образом:
memcpy(void * destination, void * source, size_t bytes);
На многих платформах, memcpy () написан в
высокооптимизированном ассемблерном коде.
Поэтому, выгода от использования memcpy () вместо
вложенных циклов может быть весьма существенна.
|