滴水三期:day17.1-switch语句反汇编

本文详细探讨了C++中switch语句的正向实现和反汇编分析,揭示了其在不同case数量和常量差值下的执行策略。对于少量且连续的case,switch使用大表优化;对于不连续或大量case,可能采用顺序比较。此外,还介绍了大表与小表的生成条件,以及它们如何节省内存和提高效率。通过对反汇编的解析,展示了switch语句在不同场景下的执行流程。

一、switch正向

  • switch语句是特定业务逻辑功能的if语句的简写

    if(表达式 == 常量1){	
    	//...代码
    }	
    else if(表达式 == 常量2){	
    	//...代码
    }	
    else if(表达式 == 常量3){	
    	//...代码
    }
    else{
    	//...代码
    }
    

    用switch表示简写为:

    switch(表达式){
        case 常量表达式1:	
    		语句;
    		break;
    	case 常量表达式2:	
    		语句;
    		break;    //break不写功能就变了
    	case 常量表达式3:	
    		语句;
    		break;
    	case 常量表达式4:	
    		语句;
    		break;
    	default:  //可以省略,但是不建议省略
    		语句;
    		break;
    }
    
  • switch语句的规范:

    • case后面必须是常量表达式
    • case后常量表达式的值不能一样
    • switch后面表达式必须为整数
  • switch语句的执行顺序:按照正向的角度,我们会以为switch和if else一样,都是一个一个的从上往下比较,但是真的如此嘛???不全是,switch强大的地方,就是在执行的效率。下面我们通过反汇编从底层去看看switch究竟怎么执行的?

  • 如果多个分支执行相同的语句,则可以如下定义:

    #include "stdafx.h"
    char x = 'C';
    int main(){
        switch(x){
            case 'A':
    		case 'B':
    		case 'C':
    		case 'D':
    		case 'E':
                x += 32;
                break; 
            default:
                printf("no");
        }
    }
    

二、switch语句反汇编

1.case数量较少时(和if类似)

这个会比较常见

  • 我们先来看看如果需要比较的常量数量较少,而且常量之间的差值不大时,switch的反汇编

    #include "stdafx.h"
    int x = 2;
    int main(){
        switch(x){    //此时只有3个case,且1,2,3这三个常量差值不大
            case 1:
                printf("1");   //不能用单引号!
                break;
            case 2:
                printf("2");
                break;
            case 3:
                printf("3");
                break;
            default:
                printf("Error");
                break;
        }
    }
    
    • 可以发现,当case常量数量较少时,switch和if else的逻辑类似,都是顺序比较判断决定是否跳转,只不过switch把所有比较跳转的指令都放在了一起,然后将所有执行的代码指令都放在了一起。所以当判断比较的常量数量较少时switch和if语句的效率差不多

      06B705B3A21A61C55B38EEF5EA83BE5E

      所以通过反汇编就发现了如果switch语句中的case代码结尾不加break,那么相当于就没有jmp 结束地址这条指令,那么在最开始cmp不断比较,只要有一个满足了,那么就je跳转到对应case中的代码指令中执行,然后依次顺序把下面的case代码和default代码都执行了,最后到switch结束地址

  • (补充)如果是下面这种格式的呢?

    #include "stdafx.h"
    char x = 'C';
    int main(){
        switch(x){
            case 'A':
    		case 'B':
    		case 'C':
    		case 'D':
    		case 'E':
                x += 32;
                break; 
            default:
                printf("no");
        }
    }
    
    • 这里也比较巧妙的判断了,没有一个一个去比较,而是用一个区间范围去比较,比如先判断x是否小于A,用AS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值