六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 39|回复: 0

gcc对c语言中的switch的优化

[复制链接]

升级  98%

57

主题

57

主题

57

主题

秀才

Rank: 2

积分
197
 楼主| 发表于 2013-1-27 05:41:33 | 显示全部楼层 |阅读模式
在c语言中switch语句会被实现为一个跳转表,跳转表是一个数组,这个数组里面存的都是地址,也就是说只要你传递给它一个i,他就会返回给你,你所需要跳转的地址,这样做得好处就是执行语句的时间和条件的个数无关..不过在gcc里面他也只是条件数大于4个,才会生成这个跳转表.

请看下面的代码:
int switch_eg(int x) {     int result = x;     switch (x) {     case 100: result *= 13; break;     case 102: result += 10; /* Fall through */     case 103: result += 11; break;     case 104:     case 106: result *= result; break;     default: result = 0;           }     return result; }
这只是一段简单的switch语句,下面我们用一段c代码来描述汇编代码所要做得事情.
code *jt[7] = {    loc_A, loc_def, loc_B, loc_C,      loc_D, loc_def, loc_D};  int switch_eg_impl(int x) {     unsigned xi = x - 100;     int result = x;     if (xi > 6) goto loc_def;     /* Next goto is not legal C */     goto jt[xi];  loc_A:      /* Case 100 */     result *= 13;     goto done;  loc_B:      /* Case 102 */     result += 10;     /* Fall through */      loc_C:    /* Case 103 */     result += 11;     goto done;  loc_D:    /* Cases 104, 106 */     result *= result;     goto done;  loc_def:  /* Default case*/     result = 0;  done:     return result; }
看上面的代码就很清楚了,它会对传进来的值与100进行一个减法,然后再将这个值传进switch语句.
而真实的汇编代码是怎么样的呢,我们可以看看:
switch_eg:pushl%ebpmovl%esp, %ebpmovl8(%ebp), %eax   //这边得到传进来的参数leal-100(%eax), %edx //这边将得到的参数和100做差cmpl$6, %edx //这边和6比较,如果大于6说明下面的条件没有满足的所以默认进入defaultjbe.L11.L2:popl%ebpxorl%eax, %eaxret.p2align 4,,7.L11:jmp*.L7(,%edx,4)       //这边也就是我们上面伪码所描述的那个jt[xi].section.rodata.align 4.align 4.L7:                    //这边就是所构造的跳转表..long.L3.long.L2.long.L4.long.L5.long.L6.long.L2.long.L6.text.L6:                         // loc_Dimull%eax, %eax  popl%ebp.p2align 4,,6ret.L5:                             //loc_cpopl%ebpmovl$114, %eax.p2align 4,,6ret.L4:                          //loc_Bpopl%ebpmovl$123, %eax.p2align 4,,4ret.L3:                          //loc_Apopl%ebpmovl$1300, %eax.p2align 4,,4ret
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表