1

我遇到了这个问题,我有点困惑。给出了两个代码,询问哪个需要更多时间,或者两者是否需要相同的时间。代码是:

void sumCal(int n,int a[][]){
   int sum=0;
   for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
         sum=sum+a[i][j];
      }
   }
}

或者

void sumCal(int n,int a[][]){
   int sum=0;
   for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
         sum=sum+a[j][i];
      }
   }
}

据我所知,这取决于内存布局,内存是按行为主还是按列为主。这是正确的答案吗?

4

2 回答 2

1

一个主要问题确实是矩阵是以行优先还是列优先格式布局的。这是由 C 标准定义的;这不是编译器编写者的事情。另一个主要问题是数组的大小。如果它小到足以放入高速缓存,那么使用哪种机制并不重要,但如果它太大而无法放入高速缓存,那么一种机制比另一种机制快得多。

它是哪一个?好吧,在 Wikipedia 上快速搜索Row-major Order显示 C 使用 row-major order。

于 2013-11-09T05:10:11.787 回答
1

我实际上不确定代码是否会首先编译,因为维度需要包含在第一个维度之后的每个维度的数组的函数参数声明中。

无论如何,C 是行主要的(意味着行中的元素连续存储在内存中,实际上对于 C 中的多维数组,整个数组是连续的),所以第一个选项可能更快,因为内部循环通过迭代遍历一行在列上。

最后,您需要知道阵列有多大,以及您正在使用的 CPU 上的 L1 缓存有多大。如果阵列可以容纳在 L1 缓存中,那么两个选项应该以相同的速度运行,因为在使用完之前不会弹出任何缓存行。

于 2013-11-09T05:44:43.023 回答