switch
① 当判断条件小于4时switch的汇编代码
Snipaste_2019-10-30_15-36-04.png
switch少量判断.png
② 当条件大于4时switch执行default的汇编代码(我传入的参数是5,switch会执行default)
switch4.png
switch-default.png
-
我们看一下ida给我们分析的(ida更加详细的给出了代码的执行顺序以及打印信息)
switchDefaultIDA.png
③ 当条件大于3时switch执行中间判断的汇编代码(我传入的参数是2)
switch-noDefault.png
switch-noDefault1.png
Snipaste_2019-11-04_12-49-31.png
switch_table.png
$总结: 当判断条件大于3的时候,代码的执行先判断是否执行default,然后再根据算法算出对应的值.(相当于生成了一个表,程序根据算法去查询表格,取出对应的值)
④对于连贯的switch判断(case1, 2, 3...)对应的有相应的算法,那对于不连贯的判断是否是单个的比较还是有对应的算法呢,下边我们看对于不连贯的的判断,看汇编代码是否一样?
switch_001.png
switch002.png
switch003.png
switch004.png
$总结: 当判断条件不连贯且中间判断条件相隔不大时,还是会执行算法,对于中间缺失的判断,内存中会用指向default的内存地址填充.我们无法控制是否让编译器执行判断语句或者是算法运算,编译器会在效率或者内存上进行取舍.
总结:
- switch语句分支较少的时候(小于4),没必要用switch...case语句,相当于if...else判断.
- 各个分支常量差值较大时,编译器会在效率或者内存上进行取舍.就相当于if...else判断.
- 在分支较多时(大于3)且分支常量差值较小的情况下,在编译的时候会生成一个表(跳转表每个地址4个字节).