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

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

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

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

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

看看片段

 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

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