Chinaunix首页 | 论坛 | 博客
  • 博客访问: 724048
  • 博文数量: 251
  • 博客积分: 10367
  • 博客等级: 上将
  • 技术积分: 2750
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-10 14:43
文章分类

全部博文(251)

文章存档

2009年(2)

2008年(86)

2007年(163)

分类: C/C++

2008-03-16 01:24:44

/*  switch1.c   */

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


;switch1.s

switch_eg:
    pushl    %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    leal    -100(%eax), %edx
    cmpl    $6, %edx
    ja    .L2
    jmp    *.L7(,%edx,4)
    .section    .rodata
    .align 4
    .align 4
.L7:                                  ;在这建了一个跳转表,这也就是为什么一般情况下
    .long    .L3                     ;switch语句比if -else高效的原因
    .long    .L2
    .long    .L4
    .long    .L5
    .long    .L6
    .long    .L2
    .long    .L6
    .text
    .p2align 4,,7
.L2:
    popl    %ebp
    xorl    %eax, %eax
    ret
.L3:
    popl    %ebp
    movl    $1300, %eax
    .p2align 4,,6
    ret
.L6:
    imull    %eax, %eax
    popl    %ebp
    .p2align 4,,4
    ret
.L5:
    popl    %ebp
    movl    $114, %eax
    .p2align 4,,4
    ret
.L4:
    popl    %ebp
    movl    $123, %eax
    .p2align 4,,4
    ret


===============================================
在switch1.c中switch(x)中的 x值都在100附近,所以有利于建表,可是如果case中的x 值很分散,会出
现什么情况呢?看下面

/* switch2.c  */

int switch_eg(int x)
{
    int result = x;

    switch (x) {
    case 1:                           //==>就增加了这个case,汇编结果却相差甚远              
         result += 2;
         break;

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


;switch2.s

;此时不适合建表了,此时的效率应该和if - else 差不多

switch_eg:
    pushl    %ebp
    movl    $123, %eax
    movl    %esp, %ebp
    movl    8(%ebp), %edx
    cmpl    $102, %edx
    je    .L9
    jle    .L12
    cmpl    $104, %edx
    je    .L7
    .p2align 4,,9
    jge    .L13
    movl    $114, %eax
    .p2align 4,,7
.L9:
    popl    %ebp
    .p2align 4,,6
    ret
    .p2align 4,,7
.L12:
    cmpl    $1, %edx
    movb    $3, %al
    .p2align 4,,5
    je    .L9
    cmpl    $100, %edx
    .p2align 4,,3
    je    .L14
.L2:
    popl    %ebp
    xorl    %eax, %eax
    .p2align 4,,2
    ret
    .p2align 4,,7
.L13:
    cmpl    $106, %edx
    .p2align 4,,5
    jne    .L2
    .p2align 4,,7
.L7:
    movl    %edx, %eax
    imull    %edx, %eax
    popl    %ebp
    .p2align 4,,2
    ret
.L14:
    popl    %ebp
    movl    $1300, %eax
    .p2align 4,,2
    ret

阅读(1143) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~