Chinaunix首页 | 论坛 | 博客
  • 博客访问: 994064
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 216
  • 用 户 组: 普通用户
  • 注册时间: 2018-11-27 17:55
文章分类
文章存档

2019年(21)

我的朋友

分类: C/C++

2019-06-30 09:57:53

switch相比if else的实现,其优势是执行效率不会因为分支的增加而变慢。
这个是如何实现的嗯,一切的奥秘就在于有个跳转表。
注意,gcc编译switch时使用跳转表需要分支在4个以上(具体多少个看gcc的实现)

点击(此处)折叠或打开

  1. int switchtest(int a, int b, int c)
  2. {
  3.     int ret;
  4.     switch(a){
  5.         case 1:
  6.             ret = b+c;
  7.             break;
  8.         case 2:
  9.             ret = b+2*c;
  10.             break;
  11.         case 3:
  12.             ret = b+3*c;
  13.             break;
  14.         case 4:
  15.         case 5:
  16.             ret = b+5*c;
  17.     }
  18.     return ret;
  19. }
arm-linux-gcc -O2 switch.c -S

点击(此处)折叠或打开

  1. switchtest:
  2.     @ Function supports interworking.
  3.     @ args = 0, pretend = 0, frame = 0
  4.     @ frame_needed = 0, uses_anonymous_args = 0
  5.     @ link register save eliminated.
  6.     sub    r0, r0, #1   @a-1 ,存入r0
  7.     cmp    r0, #4       @把r0和4比较
  8.     ldrls    pc, [pc, r0, asl #2]  @pc+r0*4,然后执行PC指向的命令,设计非常精巧
  9.     b    .L2
  10. .L7:
  11.     .word    .L9
  12.     .word    .L4
  13.     .word    .L5
  14.     .word    .L6
  15.     .word    .L6
  16. .L6:
  17.     add    r2, r2, r2, asl #2   @r2里面存的是5c,下面会继续执行.L9,即b+5c,这里被优化了
  18. .L9:
  19.     add    r3, r2, r1  @b+c
  20. .L2:
  21.     mov    r0, r3
  22.     bx    lr
  23. .L5:
  24.     add    r2, r2, r2, asl #1 @r2 = r2*2
  25.     add    r3, r2, r1      @r3 = r1+r2, 就是b+3c的意思
  26.     mov    r0, r3
  27.     bx    lr
  28. .L4:
  29.     add    r3, r1, r2, asl #1  @b+2c
  30.     mov    r0, r3
  31.     bx    lr



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