在读一些别人写的代码的时候,他们经常会写很多if-else全等判断,这种代码与switch有什么区别呢?,本次打算做个尝试,试图从汇编层面直观地查看二者的区别。下面的两个函数都是主函数,只判断type为[0-4的情况],其余情况为0x55
经过汇编后的代码如下
上述涉及到的汇编指令如下
movel将源操作数传送给目标操作数cmpl两个操作数相减,且不保存结果,但结果改变eflags寄存器的ZF标志位jne条件跳转,如果eflags的标志位为0,则跳转jmp无条件跳转je条件跳转,如果eflags的ZF位为1,则跳转jg条件跳转,若左边大于右边则发生跳转call方法调用
但是switch语句中生成的汇编中对于3进行了多次比较,但跳转的方式不同,因为我们比较的是[0-4]的离散整数,所以jg不会执行。
左侧if语句的每一次比较后都会先判断条件是否成立,再执行复合条件的跳转。
右侧switch 语句则是先判断整个条件,再跳转到相应的代码块中执行对应的程序。