|
c语言的指针和下标弄成汇编的话会比较有趣,在网上查了篇资料, 觉得
写得不错,贴出来与大家分享。
以下是转的内容:
书上讲指针法要比下标法访问数组速度快,是嘛?
我觉得楼主的问题需要更具体一些,我们区分如下三种情况:
1、定义了数组 a[n], 通过 a[i] 和 *(a+i) 来访问
2、一个指针 p 指向一段合法空间,通过 p[i] 和 *(p+i) 来访问
3、定义了数组 a[n],令指针 p = a,分别通过 p 和 a 来访问
对于情况 1、2, 访问方式 [] 和 * 是完全等价的,没有差别。
我强调一下,对于数组 a, a[ i ] 与 *(a+i) 是完全一样的。
类似地,对于指针 p, *(p+i) 与 p[i] 也是完全一样的。一样指的是生成的汇编代码没有差别。
真正有差别的是 3, 差别在于通过 a 访问还是通过 p 访问,而不在于用 [] 还是用 *
对于 3, 假如要访问 a[i]
(I) 通过 a 访问
系统只需要计算常量 a 与 i*sizeof(type) 之和,然后访问该地址
(II) 通过 p 访问
p 是个变量,系统必须先访问 p 的地址,得到 p 的值,然后计算该值 v(p) 与 i*sizeof(type) 之和, 然后再访问得到的地址。
相比之下,(II) 要稍微慢一些(指针慢)。
通过指针访问唯一有可能快的地方是使用 ++ 进行移动,然后通过 *p 访问。
但只适用与以下情况:
(a) 硬件对自增有支持,否则 ++ 被转换为 +sizeof(type) 的加法指令,也快不了。
(b) 依次遍历数组
总之,我得出如下结论,在绝大多数情况下,指针与数组相比,没有效率上的优势,有时反而更慢。
指针的真正优势是灵活,好用。
|
|