问问题描述
答精选答案

第一步计算最大公约数,如2,4,6,8为2,100,150,200为50,最大公约数记为x把case的数值全部除以x,最小的记为min,最大的记为max如果max-min数值不大,就可以用来优化。搞一个数组,max-min,记为n,全部初始化为default处理地址。
然后case数值除以最大公约数x-min为数组下标,里面存放该case处理地址,即汇编指令jump的地址。
这些过程是编译阶段的,最后直接生成一个数组,然后case就优化为一个jump指令了。如果max-min很大是不是就没优化空间了呢?也不一定,看编译器如何处理,比如1,2,3,4,5,999这种情况也是很常见的,上述方式失败之后可以去掉最大值,去掉最小值重新测试,或者用二分法,分为2部分重新测试。无论怎么复杂的测试,都是在编译中实现的,编译优化是c语言一大魅力回复 陈君陌 :没有优化空间是不是就是ifelseifelse是高级语言,编译器直接处理汇编,应该是用条件更快,那x86来说(其他汇编指令没研究),有个指令是结果为0跳转或者不为0跳转,比如case项有1,2,5,9,汇编指令可能是这样mov eax,[esi];case val的值dec eax;减一jz addr1;为0跳转到case1处理dec eaxjz addr2sub eax,3jz addr5sub eax,4jz addr,9处理default这里为啥用减一跟减法操作,这个也是优化的结果,对于寄存器操作,是非常快的,最基础的翻译应该是这样有块内存,存放有1,2,5,9这4个数字然后分别取这4个数字到寄存器,然后一个个判断,这样的编译只能称为翻译,效率是非常低的,比上述的要慢3,4倍对于不同的ifelse,编译出来的汇编也不一定相同的比如if(--i),if(i--),为啥尽量推荐前者,前者指令更快更少mov eax,[ebp+4];存放i的堆栈dec eax;dec只需要一个机器周期,是最快的指令jz addr判断成功的地方if(i--)mov eax,[ebp+4]test eax;类似i+0jnz addr判断失败地址,不为0跳转dec eax然后处理成功部分。
因此前者少了一个test指令。
对于开发人员来说,可以说跟ifelse一样,编译器把ifelse看成很多不同情况。
本文来自作者[视界W]投稿,不代表公众科技网立场,如若转载,请注明出处:https://www.cpst.net.cn/changshijingxuan/202609/298459.html
评论列表(4条)
我是公众科技网的签约作者“视界W”!
希望本篇文章《C语言用ifelse比较三个数的大小》能对你有所帮助!
本站[公众科技网]内容主要涵盖:教育咨询,知识百科
本文概览:第一步计算最大公约数,如2,4,6,8为2,100,150,200为50,最大公约数记为x把case的数值全部除以x,最小的记为min,最大的记为max如果max-min数值不大,就可以用来优化。搞一个数组,max-min,记为n,全部初始化为default处理地址。然后case数值除以最大公约数x-min为数组下标,里面存放该case处理地址,即汇编指令jump的地址。这些过程是编译阶段的,最后直接生成一个数组,然后case就优化为一个jump指令了。如果max-min很大是不是就没优化空间了呢?也不一