c语言switch反汇编的实现
作者:multi4 时间:2023-06-29 03:38:17
在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因
一、switch语句
1、在正向编码时,switch语句可以看做是if语句的简写
2、break在switch语句的妙用
1、当switch存在3个分支时
当去掉break的时候
二、switch语句的反汇编
1、当switch存在3个分支时
#include<stdio.h>
void Function(int x) {
switch (x) {
case 1:
printf("1");
case 2:
printf("2");
case 3:
printf("3");
default:
printf("4");
}
}
int main() {
Function(2);
return 0;
}
可以看出,此时switch的反汇编代码与if语句无异。
当有四个if语句的时候就会生成大表。
2、当switch语句出现四个分支时,编译器会产生大表
步骤:
1、将传进来的数先减去1,再进行比较。判断出该参数是否超过switch语句中最大常量还,即判断参数是直接进入default中还是进入case中
2、 若参数<=max,则用寄存器保留该值。并代入表达式中,通过大表直接跳到相应的地址
注意
分支少于四个,则switch无意义,编译器会按if…else…语句进行反汇编
case后的常量的顺序不影响大表的生成
将常量值的顺序打乱,观察反汇编代码
正向代码
汇编代码
这里可以看到大表里面都是自己排好序了。
将连续的10项中抹去1项或者2项,观察反汇编有无变化
正向代码是这样的
这里可以看到有几个地址是一样的
可以发现是指向默认的地址。
3、当switch存在多个分支,常量连续性相对不高时
就会生成小表
步骤:
1、将传进来的参数减去最小值,然后跟最大值相比,如果大于的话就跳到默认的地方,不然就用差值去查小表,然后查大表。
补充:当case后的常量差距较大时
编译器按照if…else…进行反汇编
来源:https://blog.csdn.net/qq_45951598/article/details/117736266
标签:c语言,switch,反汇编
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android 游戏开发之Canvas画布的介绍及方法
2021-12-14 23:10:54
Spring MVC接口防数据篡改和重复提交
2023-11-29 15:02:11
Android自定义View图片按Path运动和旋转
2022-09-15 22:53:11
![](https://img.aspxhome.com/file/2023/9/137889_0s.gif)
Java实现插入排序,希尔排序和归并排序
2022-02-24 18:45:52
![](https://img.aspxhome.com/file/2023/8/116248_0s.png)
基于eclipse.ini内存设置的问题详解
2021-08-25 02:56:55
C++类和对象之多态详解
2023-05-10 18:52:03
mybatis源码解读-Java中executor包的语句处理功能
2023-09-03 06:34:16
每日六道java新手入门面试题,通往自由的道路
2023-11-13 16:22:29
java httpclient设置超时时间和代理的方法
2023-05-10 13:05:24
一文详解Object类和抽象类
2023-06-09 16:27:14
![](https://img.aspxhome.com/file/2023/8/79238_0s.png)
c#深拷贝文件夹示例
2023-07-24 07:50:40
Java接口返回json如何忽略特定属性
2022-03-16 07:54:24
SpringBoot自定义加载yml实现方式,附源码解读
2022-01-22 22:39:40
![](https://img.aspxhome.com/file/2023/5/86025_0s.jpg)
关于在IDEA中SpringBoot项目中activiti工作流的使用详解
2022-12-11 01:24:28
![](https://img.aspxhome.com/file/2023/3/62513_0s.png)
Android用MVP实现一个简单的类淘宝订单页面的示例
2022-09-20 06:21:01
![](https://img.aspxhome.com/file/2023/7/138287_0s.gif)
Java静态代理和动态代理总结
2022-01-02 18:49:21
在C#中根据HardwareID获取驱动程序信息的实现代码
2023-08-04 08:15:31
Java 程序员掌握 Spring Boot非常有必要
2021-06-27 19:06:52
![](https://img.aspxhome.com/file/2023/1/113511_0s.png)
Android自定义View实现星星评分效果
2023-10-27 23:10:42
![](https://img.aspxhome.com/file/2023/0/137740_0s.png)
Android RecyclerView添加上拉加载更多功能
2022-08-02 00:03:51
![](https://img.aspxhome.com/file/2023/8/94288_0s.gif)