指针和数组的效率对比

来源:互联网 发布:淘宝付费流量占比 编辑:程序博客网 时间:2024/05/18 01:00

    我们知道指针表达式和下标表达式是等价的,比如:

    array[10] = 10;

    *(array + 10) = 10;

     或者有时候我们这样写:

    2[array]

    但因为它表示成指针表达式为*(2 + array) ,所以这种古怪的写法和array[2]是相等的。

    那么你应该用哪一个呢?

    很多人会选择下标表示,我想他们更多是考虑下标的可读性和容易理解,但如果从性能上讲的话,这个选择可能会影响运行时的效率。

    我们来做个实验:

   

    两个循环执行相同的任务,我们看它生成的汇编:

    先看数组形式:

 

 注意第8行中 movl  $0, -44(%ebp, %eax, 4)

 这里操作数-44(%ebp,%eax,4) 在执行过程中会相乘(%ebp + 4*%eax - 44),这个乘法需要花费一定的时间和空间

 现在我们看看指针表达式的执行

 其实,在执行过程中本来也是存在的乘法,这个乘法运算出现在for语句的调整部分。1 这个值必须与整型的长度相乘,然后再与指针相加。但在每次执行中,执行乘法运算的都是两个相同的数。结果这个乘法就只在编译时执行了一次,程序把4与指针相加。不执行乘法运算。

 

这个小例子说明了指针比下标更有效率。

现在考虑下面的代码:

a = get_value();

array[a] = 0;

 

a = get_value();

*(array + a) = 0;

两边的语句所产生的代码并没有区别。a可能是任何值,在运行时方知。所以两种方案都需要乘法指令,用于对a值进行调整。这个例子说明指针和下标的效率完全相同的场合。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 控水一个月的三角梅还没开花怎么办 帮别人办手机分期不还怎么办 国美在线没有信用卡分期不了怎么办 手机店办理分期被老板套现了怎么办 美的空调保修卡丢了怎么办 格力空调保修卡丢了怎么办 荣耀9i手机总是滑手怎么办? 春兰空调没发票不给修怎么办 洗衣机顶盖的安全开关坏了怎么办 苹果手机的开关健坏了怎么办 淘宝买的东西快递弄破损了怎么办 京东购买邮来手机里面没有怎么办 孕期建卡病历本丢了怎么办 四维检查胎儿心脏有缺陷怎么办 七个月的宝宝俩个蛋蛋都疝气怎么办 电脑有些网站看视频不能全屏怎么办 小米滑板车坏了售后不保修怎么办 红米4a电池不耐用怎么办 华为手机买个别人退货的怎么办 京东购物怎么查订单查询不到怎么办 退款了又收到货怎么办快递打电话 快递未收到货能退款商家拒绝怎么办 黑色牛仔裤有一块洗白了怎么办 黑色牛仔裤被洗衣液烧了怎么办 在蘑菇街退鞋子商家非说脏了怎么办 牛皮屑怎么办ke靠成都银康 微信订阅号取消关注之后还在怎么办 腾讯新闻红包领取说帐号异常怎么办 计算机职弥报名没选模块怎么办 有人用我手机注册有赞了怎么办 一件代发别人的货被投诉了怎么办 淘宝极速退款后商家拒收快递怎么办 运费险退到天猫垫付账户了怎么办 淘宝卖家食品有问题该怎么办 美团外卖不要辣椒给放了怎么办 旺旺卖家拒收我的消息怎么办 淘宝清空购物车大奖到上限了怎么办 游戏无响应除了退出还能怎么办 淘宝给差评了卖家一直打电话怎么办 电脑说带宽问题无法观看视频怎么办 手机淘宝上的购买信息删除了怎么办