if-else 和 switch区别

2021-07-22  本文已影响0人  coder_feng

条件码寄存器

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。当x<y时,SF将会被置为1。而当x>y时,ZF和SF将同时为0

条件码寄存器的组合

测试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 链接

上一篇 下一篇

猜你喜欢

热点阅读