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。当x<y时,SF将会被置为1。而当x>y时,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<b,也就是小于的意思。当OF为1时,则代表产生了溢出,而此时SF必须为0,也就是说结果最后为正数,那么此时则是负溢出,也可以得到a-b<0,即a<b。综合前面两种情况,SF^OF则代表小于的意思。
  • 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<b。其实这个结论很显然,关键点就在于,无符号减法只有在减出负数的时候才可能溢出,也就是说只要结果溢出了,那么一定有a-b<0。因此这个结论就显而易见了。
  • 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 链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容