C阵列/指针参数转换

Tan*_*aki 2 c memory arrays pointers function-declaration

我有一个用C编写的通用问题求解器,它接受一个值数组并就地解决它.该问题被视为固定大小的数组,然后传递给求解函数.切换到使用指针而不是固定大小的数组时,我遇到了一个奇怪的性能问题.

设置代码如下:

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

我已经测试了以下声明和调用(没有关于程序更改的其他内容):

// 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
Run Code Online (Sandbox Code Playgroud)

solve_board部分是递归的,因此在执行期间会进行多次调用.所有病例的结果都是准确的.

任何人都可以解释为什么使用动态数组需要比传递固定大小的数组更长的时间?

Typ*_*eIA 7

这很可能是问题所在:

memcpy(board2, board, 256);
Run Code Online (Sandbox Code Playgroud)

这会将256 个字节(而不是整数)从一个阵列复制到另一个阵列.你可能意味着:

memcpy(board2, board, 256 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

所以你的两个测试用例没有在相同的数据上运行.剩下的(256*(sizeof(int) - 1))字节board2 是未初始化的并且具有垃圾(=未定义)值.