if-else 和 switch区别

条件码寄存器

CF:进位标志寄存器,它记录无符号操作的溢出,当溢出时会被设为1
ZF:零标志寄存器,当计算结果为0时将会被设为1。
SF:符号标志寄存器,当计算结果为负数时会被设为1。
OF:溢出标志寄存器,当计算结果导致了补码溢出时,会被设为1。

cmp

cmp是compare的意思,它有两个操作数,比如cmp S2,S1,最终会基于S1-S2的值去设置条件码寄存器的值

cmpl %edx,%eax这个指令来讲,假设%edx的值为y,%eax的值为x。则当x=y时,ZF将会被置为1。当xy时,ZF和SF将同时为0

条件码寄存器的组合

  • e->ZF(相等):e是equals的意思。这里代表的组合是ZF,因为ZF在结果为0时设为1,即a-b=0,也就是说a==b。因此ZF代表的意义是相等。
  • ne->~ZF(不相等):ne是not equals的意思。这里代表的组合是~ZF,也就是ZF做“非运算”,则很明显是不相等的意思。
  • s->SF(负数):s这里没什么实际意义,因为负数的直译是negative number,首字母是n,这与not的首字母重复了,因此这里就取了SF条件码寄存器的首个字母(纯属LZ的猜测,无权威证明,不过LZ自我感觉应该八九不离十,0.0)。这里代表的组合是SF,因为SF在计算结果为负数时设为1,此时可以认为b为0,即a<0。因此这里是负数的意思。
  • ns→~SF(非负数):与s相反,加上n则是not的意思,因此这里代表非负数。
  • l->SFOF(有符号的小于):l代表的是less。这里的组合是SFOF,即对SF和OF做“异或运算”。“异或运算”的意思则是代表,SF和OF不能相等。那么有两种情况,当OF为0时,则代表没有溢出,此时SF必须为1,SF为1则代表结果为负。即a-b<0,也就是a
  • le->(SF^OF)|ZF(有符号的小于等于):le是less equals的意思。有了前面小于的基础,这里就很容易理解了。SF^OF代表小于,ZF代表等于,因此两者的“或运算”则代表小于等于。
  • g→(SF^OF)&ZF(有符号的大于):g是greater的意思。这里的组合是(SF^OF)&ZF,相对来说就比较复杂了。不过有了前面的铺垫,这个也非常好理解。SFOF代表小于,则~(SFOF)代表大于等于,而ZF代表不等于,将(SF^OF)与~ZF取“与运算”,则代表大于等于且不等于,也就是大于。
  • ge->~(SF^OF)(有符号的大于等于):ge是greater equals的意思。这个组合就不需要再解释了吧。
  • b->CF(无符号的小于):b是below的意思。CF是无符号溢出标志,这里的意思是指如果a-b结果溢出了,则代表a是小于b的,即a
  • be->CF|ZF(无符号的小于等于):这里是below equals的意思。因此这里会与ZF计算“或运算”,字面上也很容易理解,即CF(小于)|(或)ZF(等于),也就是小于等于
  • a→CF&ZF(无符号的大于):a代表的是above。这个组合也是非常好理解的,CF代表小于,则CF代表大于等于,ZF代表不等于,因此CF&ZF则代表大于等于且不等于,即大于。
  • ae->~CF(无符号的大于等于):ae是above equals的意思

测试demo

ifelseswitch1.png
ifelseswitch2.png

打印出来的结果都是4,但是效率那个高呢?


ifelseswitch3.png

可以看到if-else 是一条条命令的判断,最终匹配的最佳项才停止运行


ifelseswitch4.png

接下来更改条件看看看看
ifelseswitch5.png
ifelseswitch6.png
ifelseswitch7.png
ifelseswitch8.png
  0x100000ec8 <+72>:  movslq (%rax,%rcx,4), %rdx   (rdx来源于前面的计算,简而言之就是来源于变量值减去最小条件的差值),另外4个字节说明内存是连续的,至少在这里是这样

    0x100000ecc <+76>:  addq   %rax, %rdx

    0x100000ecf <+79>:  jmpq   *%rdx

其实上面这几句就是核心代码,前面两行算好内存地址,第三步直接跳到相应的执行方法,不需要和if 一行行比较

这里有个问题,那如果中间有一个值非常大的话,那么是不是会空出一段内存空间,造成浪费

ifelseswitch9.png

2-100 之间的连续内存是不是就会浪费掉?
ifelseswitch10.png

这种情况可以发现其实和if-else 一样的了,所以写代码的时候自己含量,switch其实就是用空间换时间来提高效率

demo 链接

你可能感兴趣的:(if-else 和 switch区别)