VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 2895|回复: 0

(c语言)书上讲指针法要比下标法访问数组速度快,是嘛?

[复制链接]
发表于 2015-9-28 16:15:30 | 显示全部楼层 |阅读模式
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) 依次遍历数组

           总之,我得出如下结论,在绝大多数情况下,指针与数组相比,没有效率上的优势,有时反而更慢。
           指针的真正优势是灵活,好用。

  

点评

你以为编译器傻啊,编译成汇编的时候会自动优化的  发表于 2015-10-1 13:53
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-2-3 15:01

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表