假设switch语句的分支比较少的时候(例如3,少于4的时候没有意义)没有必要使用此结构,相当于if(可观察反汇编得出此结论)。
1、各个分支常量的差值较大的时候,编译器会在效率还是内存进行取舍,这个时候编译器还是会编译成类似于if,else的结构。
2、在分支比较多的时候:在编译的时候会生成一个大表(跳转表每个地址四个字节)且各个分支常量的差值较小(或者连续)的时候,保存各个分支执行的代码首地址。
3、当差值较大的时候且(最大值和最小值)差值于256时,编译器会生成一个小表(跳转表每个字节保存的是相对于首地址低偏移量)。
查找方式:
在传入参数的时候,系统会利用参数计算出一个地址,直接调转到执行部分。
在分支常量表达式为不连续的值时,编译器会编译成类似搜索二叉树的结构。
多分支的switch反汇编结果:
temp:x-1 temp和3作比较,若temp大于3,则跳转到default分支。
不跳,则:edx=temp
下一步的跳转地址的地址:edx*4+0AA53BCh
0AA533E mov eax,dword ptr [x]
00AA5341 mov dword ptr [ebp-0C4h],eax
00AA5347 mov ecx,
dword ptr [ebp-0C4h]
temp
00AA534D sub ecx,1
00AA5350 mov dword ptr [ebp-0C4h],ecx
00AA5356 cmp dword ptr [ebp-0C4h],3
00AA535D ja $LN7+0Dh (0AA53A6h) E
00AA535F mov edx,dword ptr [ebp-0C4h]
00AA5365 jmp dword ptr [edx*4+0AA53BCh]
00AA536C push offset string "1" (0AA7B30h)
00AA5371 call _printf (0AA1401h)
00AA5376 add esp,4
00AA5379 jmp $LN7+0Dh (0AA53A6h)
00AA537B push offset string "2" (0AA7B34h)
00AA5380 call _printf (0AA1401h)
00AA5385 add esp,4
00AA5388 jmp $LN7+0Dh (0AA53A6h)
00AA538A push offset string "3" (0AA7B38h)
00AA538F call _printf (0AA1401h)
00AA5394 add esp,4
00AA5397 jmp $LN7+0Dh (0AA53A6h)
00AA5399 push offset string "4" (0AA7B3Ch)
00AA539E call _printf (0AA1401h)
00AA53A3 add esp,4