考虑下面两个C语言函数来计算2D数组中的元素的总和。忽略编译器优化,哪两个更好地实现总和?
// Function 1
int fun1(int arr[R][C])
{
int sum = 0;
for (int i=0; i<R; i++)
for (int j=0; j<C; j++)
sum += arr[i][j];
}
// Function 2
int fun2(int arr[R][C])
{
int sum = 0;
for (int j=0; j<C; j++)
for (int i=0; i<R; i++)
sum += arr[i][j];
}
在C / C ++中,元素以行优先顺序存储。因此,第一个实现具有更好的空间局部性(附近的存储器位置在连续迭代中被引用)。因此,第一个实现应优先用于迭代多维数组。