码迷,mamicode.com
首页 > 其他好文 > 详细

switch 表结构

时间:2016-06-05 18:28:22      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

c/c++中 switch分支结构的速度要比if else快是为什么呢?

  

;总结
switch适用于 分支多与4个的时候编译器会为建立一张内存表每个switch分支的地址放在这个表内,只需减去分支最小的数然后跳转就可,
      没有了if else的依次比较的结构
 
 sub         edx,1 减去分支最小的数
0040F2E7   jmp         dword ptr [edx*4+40F366h] edx*4得到字节数 + 40F366h或取跳转地址
 
;switch 分支为四个的时候的反汇编
;code
#include <stdlib.h>
int main(int argc, char* argv[])
{
    int n=4;
    switch(n)
    {
    case 1 :
        printf("A");
        break;
    case 2:
        printf("B");
        break;;
    case 3:
        printf("C");
        break;
    case 4:
        printf("D");
        break;
    default:
        printf("Error");
        break;
    }
    system("pause");
    return 0;
}
#include <stdlib.h>
 
int main(int argc, char* argv[])
{
    int n=4;
    switch(n)
    {
    case 1 :
        printf("A");
        break;
    case 2:
        printf("B");
        break;;
    case 3:
        printf("C");
        break;
    case 4:
        printf("D");
        break;
    default:
        printf("Error");
        break;
    }
    system("pause");
    return 0;
}
 
;registers code
 
main:
0040F2B0   push        ebp
0040F2B1   mov         ebp,esp
0040F2B3   sub         esp,48h
0040F2B6   push        ebx
0040F2B7   push        esi
0040F2B8   push        edi
0040F2B9   lea         edi,[ebp-48h]
0040F2BC   mov         ecx,12h
0040F2C1   mov         eax,0CCCCCCCCh
0040F2C6   rep stos    dword ptr [edi]
0040F2C8   mov         dword ptr [ebp-4],4  
0040F2CF   mov         eax,dword ptr [ebp-4]
0040F2D2   mov         dword ptr [ebp-8],eax
0040F2D5   mov         ecx,dword ptr [ebp-8]
0040F2D8   sub         ecx,1    4 -3 =3
0040F2DB   mov         dword ptr [ebp-8],ecx
0040F2DE   cmp         dword ptr [ebp-8],3   3是否高于3高了跳到打印Error0040F32A   push        offset string "Error" (00424250)
0040F2E2   ja          $L863+0Fh (0040f32a)   
0040F2E4   mov         edx,dword ptr [ebp-8]
0040F2E7   jmp         dword ptr [edx*4+40F357h]  (3 *4) 40F357h 得到大表存的跳转内存地址址 0040F31B   push        offset string "D" (00424024)
$L857:
0040F2EE   push        offset string "A" (00424030)
0040F2F3   call        printf (004011d0)
0040F2F8   add         esp,4
0040F2FB   jmp         $L863+1Ch (0040f337)
$L859:
0040F2FD   push        offset string "B" (0042402c)
0040F302   call        printf (004011d0)
0040F307   add         esp,4
0040F30A   jmp         $L863+1Ch (0040f337)
$L861:
0040F30C   push        offset string "C" (00424028)
0040F311   call        printf (004011d0)
0040F316   add         esp,4
0040F319   jmp         $L863+1Ch (0040f337)
$L863:
0040F31B   push        offset string "D" (00424024)
0040F320   call        printf (004011d0)
0040F325   add         esp,4
0040F328   jmp         $L863+1Ch (0040f337)
0040F32A   push        offset string "Error" (00424250)
0040F32F   call        printf (004011d0)
0040F334   add         esp,4
0040F337   push        offset string "pause" (0042401c)
0040F33C   call        system (004010c0)
 
 

switch 表结构

标签:

原文地址:http://www.cnblogs.com/jk0011/p/5561108.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!