打印
[应用方案]

Switch case中的case顺序

[复制链接]
783|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LOVEEVER|  楼主 | 2024-5-23 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


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

使用特权

评论回复
沙发
eleg34ance| | 2024-7-11 13:21 | 只看该作者
您提到的关于 switch 语句的优化策略是正确的。switch 语句在编译时可以被转化为不同的底层实现,具体取决于编译器和 case 值的分布情况

使用特权

评论回复
板凳
清芯芯清| | 2024-7-11 14:31 | 只看该作者
当 case 值是小的连续整数时,编译器通常会使用跳转表来实现 switch 语句

使用特权

评论回复
地板
suiziq| | 2024-7-11 15:33 | 只看该作者
跳转表是一个数组,其中每个元素对应一个 case 值的跳转地址。这种方式非常高效,因为查找时间复杂度是 O(1)

使用特权

评论回复
5
gongqijuns| | 2024-7-11 16:40 | 只看该作者
当 case 值不是连续的或者分布不均匀时,编译器可能会使用比较链(也称为 if-else-if 链)来实现 switch 语句。这种方式涉及到一系列的比较操作,直到找到匹配的 case 值

使用特权

评论回复
6
yuliangren| | 2024-7-11 17:46 | 只看该作者
将最有可能匹配的 case 值放在前面,这样可以减少平均比较次数,提高性能

使用特权

评论回复
7
canfeil| | 2024-7-11 18:51 | 只看该作者
如果 case 值是小的连续整数,编译器更有可能使用跳转表,这是一种非常高效的实现方式

使用特权

评论回复
8
清芯芯清| | 2024-7-12 08:33 | 只看该作者
尽量使用简单的整数值作为 case 值,避免使用复杂的表达式,因为这会增加编译器的优化难度

使用特权

评论回复
9
nqty| | 2024-7-12 09:42 | 只看该作者
确保有一个 default 分支来处理未预料到的情况,这样可以提高代码的健壮性

使用特权

评论回复
10
miltk| | 2024-7-12 10:44 | 只看该作者
我觉得都差不多,但是楼主说的确实是比较好的方式

使用特权

评论回复
11
twinkhahale| | 2024-7-12 13:00 | 只看该作者
一般来说,就是优先把可能实现的条件放最初的地方,提高执行效率

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

291

主题

1963

帖子

4

粉丝