为什么使用数组索引循环数组比指针访问慢?

时间:2014-10-07 16:40:16

标签: c arrays pointers

我正在阅读Kochan的书"用C"编程。在p。中的Pointer和Arrays部分中。 264他说:

  

通常,索引数组的过程比执行索引要花费更多时间   访问指针内容的过程。实际上,这是主要原因之一   为什么指针用于访问数组的元素 - 生成的代码是   通常更有效率。当然,如果对阵列的访问通常不是顺序的,   指针完成任何事情,就这个问题而言,因为表达式   *(指针+ j)执行时与表达式数组[j]一样长。

有人可以解释什么比什么更快?具体来说,如果array [j]的速度= *(指针+ j)的速度,则索引数组的过程以及访问指针内容的过程< / em>?此外,有关SO的问题和答案提到在编译期间将数组[j]转换为*(数组+ j),因此不应该有任何区别。

要点: 请给我一个Kochan所说的非常简单的例子。 2段代码并指向更快的代码,不必解释为什么它是真的。

1 个答案:

答案 0 :(得分:5)

查看代码段

int arr[5] = {0};
int *p = arr;
int c = 1;

现在,请参阅循环1:

for(int i = 0; i < 5; i++)
     arr[i] = c++ + 1;

循环2:

for(int i = 0; i < 5; i++)
     *p++ = c++ + 1; 

这两个循环之间的区别在于它们的身体。第一个循环包含arr[i] = c++ + 1。这相当于*(arr + i) = c++ + 1*(arr + i)是什么意思? 这意味着:

  • 获取基指针地址。
  • 获取i
  • 的值
  • i的值添加到基址。
  • 取消引用最终地址。

在第二个循环的情况下*p++表示:

  • 获取p
  • 的值
  • 在递增之前取消引用地址。
  • 1增加地址。

当然第二个会执行得更快。但是,现在有一天现代编译器足够智能来优化这些代码,并且很可能你会得到两个循环相同的结果。