Switch case中的case顺序

描述

Switch case中的case顺序

Switch 可能转化成多种不同算法的代码。其中最常见的是跳转表和比较链/树。当switch用比较链的方式转化时,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,匹配时就跳转到满足条件的语句执行。所以,可以对case的值依照发生的可能性进行排序,把最有可能的放在第一位,这样可以提高性能。

此外,在case中推荐使用小的连续的整数,因为在这种情况下,所有的编译器都可以把switch 转化成跳转表。

不好的代码:

int days_in_month, short_months, normal_months, long_months;
......
switch (days_in_month)
{
  case 28:
  case 29:
    short_months ++;
    break;
  case 30:
    normal_months ++;
    break;
  case 31:
    long_months ++;
    break;
  default:
    cout < < "month has fewer than 28 or more than 31 days" < < endl;
    break;
}

推荐的代码:

int days_in_month, short_months, normal_months, long_months;
......
switch (days_in_month)
{
  case 31:
    long_months ++;
    break;
  case 30:
    normal_months ++;
    break;
  case 28:
  case 29:
    short_months ++;
    break;
  default:
    cout < < "month has fewer than 28 or more than 31 days" < < endl;
    break;
}

提升循环的性能

要提升循环的性能,减少多余的常量计算非常有用(比如,不随循环变化的计算)。

不好的代码(在for()中包含不变的if()):

for( i ...)
{
  if( CONSTANT0 )
  {
     DoWork0( i );// 假设这里不改变CONSTANT0的值
  }
  else
  {
    DoWork1( i );// 假设这里不改变CONSTANT0的值
  }
}

推荐的代码:

if( CONSTANT0 )
{
  for( i 。。。)
  {
    DoWork0( i );
  }
}
else
{
  for( i 。。。)
  {
    DoWork1( i );
  }
}

如果已经知道if()的值,这样可以避免重复计算。虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。

选择好的无限循环写法

在编程中,我们常常需要用到无限循环,常用的两种方法是while (1)for (;;)。这两种方法效果完全一样,但哪一种更好呢?让我们看看它们编译后的代码。

编译前:

while (1);

编译后:

mov eax,1
test eax,eax
je foo+23h
jmp foo+18h

编译前:

for (;;);

编译后:

jmp foo+23h

显然,for (;;)指令少,不占用寄存器,而且没有判断、跳转,比while (1)好。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分