读书人

如何才能不使用if分支跳转减少代码复

发布时间: 2013-07-09 09:50:47 作者: rapoo

怎么才能不使用if分支跳转,减少代码复杂度
读取了一个值,然后需要和四五个常量值比较大小,目前用了五个if分支语句,觉得很丑陋
可以用switch来让代码变漂亮点吗?
求老鸟介绍经验
注意我标注的两处,针对LS的,编译器会先判断条件是不是999,然后其他的判断和之前一样:我说过编译器不傻,他会根据情况作均衡
3)因为平时用GCC多些:在GCC中,如果条件不够连续,编译器会用两次索引表(及多两条赋值指令),但如果条件过于稀疏,情况就不是这样了,所以这是个优化的技巧;因为没有研究;VC++平时用的很少,不是很确定,大家可以无视;
早先在我们课堂上,一般说法是switch...case高命中的条件在最前边,实际,在近代编译器中大可不比这样,注意条件尽量连续和紧凑,编译器会选择合适的方法
我写的不是很清楚,应该是从case 101,case 102等等一直 到999,是连续的 if else用的是 (a<1000) && (a>100) ,会是900个左右case的效率比if else的效率要高么?
1) 首先,手工写900个case是不是也是一件很累人的事情?用两行if...else可以搞定的为什么要写900个case ?
2)即使真的很变态的写了900个case,编译器会怎么作?他会用两条if...else...代替:编译器会去平衡确认用什么方法:
如原始代码如下:
如何才能不使用if分支跳转,减少代码复杂度
其可执行代码如下:
如何才能不使用if分支跳转,减少代码复杂度
注意到,最终目标码会被转成一条if...else.... 不知道这样的回答您是否满意,或清楚?

在早期的编译器(大约十几年前),针对这类条件众多的情况,我们的一个主要技巧是手工使用函数指针,但近代编译器他会均衡这些,所以软件工程师更多应该是注意代码的整洁和清晰:这些事情是编译器应该考虑的;但是还是有个地方:多数情况下swith...case效能较多级if...else的高,原因是switch...case在条件合适时是一次命中,可惜的是我还没有发现编译器会将if...else翻译成这样可以一次命中的写法;当然具体用什么方法,我想不要较真和纠结了:根据情况灵活使用
回答结束了。希望这次应该是够清楚的了。
[解决办法]

引用:
那肯定是使用switch ,其和if相比较,如果if写成
if(a1)
dosomething
else
if (a2)
dosomething
else
if(....)
则,效率应该差别不大

但是如果if写成
if (a1) dosomething
if (a2) dosomething
.....
if (a2) dosomething

那么if效率比较低 因为shitch 在a1成立时,执行a1的事情后,直接跳出分支,
而if 即使a1成立执行a1代码后,仍然会傻傻的为每个分支做判断

非也,这个说法是不对的,即使针对第一种情况,在条件相对连续的时候switch...case是一次命中,除default是没有判断的。因此,即使针对第一种情况,switch...case也有可能会比多级if...else效能高很多;(请注意看我之前的反汇编例子)

读书人网 >C语言

热点推荐