c语言switch反汇编的实现

作者:multi4 时间:2023-06-29 03:38:17 

在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因

一、switch语句

1、在正向编码时,switch语句可以看做是if语句的简写

c语言switch反汇编的实现

2、break在switch语句的妙用

1、当switch存在3个分支时

c语言switch反汇编的实现

当去掉break的时候

c语言switch反汇编的实现

二、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;
}

c语言switch反汇编的实现

可以看出,此时switch的反汇编代码与if语句无异。
当有四个if语句的时候就会生成大表。

c语言switch反汇编的实现

2、当switch语句出现四个分支时,编译器会产生大表

步骤:

1、将传进来的数先减去1,再进行比较。判断出该参数是否超过switch语句中最大常量还,即判断参数是直接进入default中还是进入case中

2、 若参数<=max,则用寄存器保留该值。并代入表达式中,通过大表直接跳到相应的地址
注意

分支少于四个,则switch无意义,编译器会按if…else…语句进行反汇编
case后的常量的顺序不影响大表的生成

将常量值的顺序打乱,观察反汇编代码

正向代码

c语言switch反汇编的实现

汇编代码

c语言switch反汇编的实现

这里可以看到大表里面都是自己排好序了。

将连续的10项中抹去1项或者2项,观察反汇编有无变化

正向代码是这样的

c语言switch反汇编的实现

这里可以看到有几个地址是一样的

c语言switch反汇编的实现

可以发现是指向默认的地址。

c语言switch反汇编的实现

3、当switch存在多个分支,常量连续性相对不高时

c语言switch反汇编的实现

就会生成小表

c语言switch反汇编的实现

步骤:

1、将传进来的参数减去最小值,然后跟最大值相比,如果大于的话就跳到默认的地方,不然就用差值去查小表,然后查大表。

补充:当case后的常量差距较大时

编译器按照if…else…进行反汇编

来源:https://blog.csdn.net/qq_45951598/article/details/117736266

标签:c语言,switch,反汇编
0
投稿

猜你喜欢

  • 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
  • Java实现插入排序,希尔排序和归并排序

    2022-02-24 18:45:52
  • 基于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
  • c#深拷贝文件夹示例

    2023-07-24 07:50:40
  • Java接口返回json如何忽略特定属性

    2022-03-16 07:54:24
  • SpringBoot自定义加载yml实现方式,附源码解读

    2022-01-22 22:39:40
  • 关于在IDEA中SpringBoot项目中activiti工作流的使用详解

    2022-12-11 01:24:28
  • Android用MVP实现一个简单的类淘宝订单页面的示例

    2022-09-20 06:21:01
  • Java静态代理和动态代理总结

    2022-01-02 18:49:21
  • 在C#中根据HardwareID获取驱动程序信息的实现代码

    2023-08-04 08:15:31
  • Java 程序员掌握 Spring Boot非常有必要

    2021-06-27 19:06:52
  • Android自定义View实现星星评分效果

    2023-10-27 23:10:42
  • Android RecyclerView添加上拉加载更多功能

    2022-08-02 00:03:51
  • asp之家 软件编程 m.aspxhome.com