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

posted on 2012-08-03 13:51  Jianfei Hu  阅读(269)  评论(0编辑  收藏  举报