switch语句的实现

前两天在实验室翻书,看到《深入理解计算机系统》开头一章提到了一个问题,switch语句和if else 的效率一样么?Why?顿时萌生了很大的兴趣,准备一搞。

不过google一下,发现别人的博客里面讲的也差不多了,我就学习下吧-_-

简而言之,switch语句在case 里面的取值比较集中的情况下,如 case 1, case 3, case 4, case 5 ... 会构造一个地址表,

地址表里面记录了依次应该跳转的标号,jmp的时候,就将switch()的变量减去最小值,获取比地址表里面的偏移量,然后将对应偏移量的地址作为jmp的

目的地值。O(e)的复杂度啊。

如果分部比较稀疏的话,

1) case个数比较少, 就直接cmp value, variable; je Label X

(其实即使是这种优化最少的switch,效率也还是比if else 要高,编译 if else 的代码,会看到, if不成立调到else if 的分支,还要进行一次cmp

原因是因为switch的值是互斥的,简单int, 而if (a) else if (B) 隐藏的条件是if (a) if (!A&&B) 复杂了。。。)

2)case个数比较多,将整个case 的变量排序,然后cmp的顺序是按照二分查找的顺序进行比较. 减少平均的比较次数。

 

弄明白之后,觉得写编译器的老爷爷碉堡了......

 

自己也做了一点实验,懒得把汇编代码贴上去了,网上有,给个传送门吧

http://tianlihu.iteye.com/blog/400283

转载于:https://www.cnblogs.com/bluesea147/archive/2012/08/03/2621509.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值