【发布时间】:2014-10-07 16:40:16
【问题描述】:
我正在阅读 Kochan 的书“C 语言编程”。在第 10 页的指针和数组部分中。 264 他说:
一般来说,索引数组的过程比执行索引需要更多的时间 访问指针内容的过程。其实这是主要原因之一 为什么使用指针来访问数组的元素——生成的代码是 一般效率更高。当然,如果对数组的访问一般不是顺序的, 就这个问题而言,指针什么也没做,因为表达式 *(pointer + j) 与表达式 array[j] 的执行时间一样长。
有人可以解释什么比什么更快吗?具体来说,如果array[j]的速度= *(pointer + j)的速度那么索引数组的过程和访问指针内容的过程 /em> ?另外,关于 SO 的问题和答案提到 array[j] 在编译过程中被转换为 *(array+j) 所以应该没有任何区别。
总结: 请给我一个非常简单的例子来说明 Kochan 所说的话。 2段代码,指向更快的一段,不用解释为什么是真的。
【问题讨论】:
-
那本书是哪一年的?
-
我认为 Kochan 所说的是,将指针增加元素大小比将索引乘以元素大小并将其添加到基地址要快。这是差异足够小以至于可能无关紧要的情况之一,如果您的工作水平确实很重要,那么您可能已经很清楚这种差异。
-
这是第 3 版,我想是 2005 年
-
Afaik,这曾经是正确的,并且仍然经常在没有优化的情况下进行编译(如果您将 C 视为“可移植的汇编语言”,那么通过递增指针来遍历数组在抽象机器)。今天,总的来说,它不是。对于更复杂的循环,这甚至可以加强编译器的别名分析并导致代码效率降低。 (这是我在上次实验中记得的,我需要大量的
restricts 用于非平凡的循环,以使指针增量版本与数组索引版本同样快,并且没有让它们更快。 )