C Array/ Указатель Преобразование аргумента

У меня есть общий решатель проблем, написанный на C, который принимает массив значений и решает его на месте. Задача принимается как массив фиксированного размера, а затем передается решающей функции. Я столкнулся со странной проблемой производительности при переключении на использование указателей вместо массива фиксированного размера.

Код установки следующий:

int main() {
  int board[256];
  ...
  int *board2 = malloc(sizeof(int) * 256);
  memcpy(board2, board, 256);
  int result = solve_board(___);
}

Я проверил следующие объявления и вызовы (больше ничего об изменениях программы):

// type 1 - fixed-size array
int solve_board(int board[256]);
solve_board(board);  // 1.167 seconds
solve_board(board2); // 3.760 seconds
// type 2 - pointer
int solve_board(int *board);
solve_board(board);  // 1.173 seconds
solve_board(board2); // 3.529 seconds

solve_board является частично рекурсивным, поэтому во время выполнения вызов выполняется большое количество раз. Результаты точны для всех случаев.

Кто-нибудь может объяснить, почему использование динамического массива занимает намного больше времени, чем передача массива фиксированного размера?

1 ответ

Решение

Весьма вероятно, что это проблема:

memcpy(board2, board, 256);

Это копирует 256 байтов, а не целые, из одного массива в другой. Вы, вероятно, имеете в виду:

memcpy(board2, board, 256 * sizeof(int));

Таким образом, ваши два тестовых примера не работали с одними и теми же данными. Оставшиеся (256 * (sizeof(int) - 1)) байты board2 были неинициализированы и имели мусорные (= неопределенные) значения.

Другие вопросы по тегам