Перейти к содержимому

Фотография

Эффективное копирование массивов

- - - - -

  • Авторизуйтесь для ответа в теме

#1
daimond

Отправлено 15 ���� 2008 - 04:13

daimond

    Свояк

  • Пользователи
  • 232 сообщений
Предположим, Вы хотите скопировать содержимое одного двумерного массива в другой:

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() объявлена в заголовочном файле следующим образом:
memcpy(void * destination, void * source, size_t bytes);

На многих платформах, memcpy () написан в высокооптимизированном ассемблерном коде. Поэтому, выгода от использования memcpy () вместо вложенных циклов может быть весьма существенна.