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
были неинициализированы и имели мусорные (= неопределенные) значения.