[应用方案] Switch case中的case顺序

[复制链接]
1583|10
 楼主| LOVEEVER 发表于 2024-5-23 18:16 | 显示全部楼层 |阅读模式


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

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

不好的代码:

  1. int days_in_month, short_months, normal_months, long_months;
  2. ......
  3. switch (days_in_month)
  4. {
  5.   case 28:
  6.   case 29:
  7.     short_months ++;
  8.     break;
  9.   case 30:
  10.     normal_months ++;
  11.     break;
  12.   case 31:
  13.     long_months ++;
  14.     break;
  15.   default:
  16.     cout << "month has fewer than 28 or more than 31 days" << endl;
  17.     break;
  18. }

推荐的代码:

  1. int days_in_month, short_months, normal_months, long_months;
  2. ......
  3. switch (days_in_month)
  4. {
  5.   case 31:
  6.     long_months ++;
  7.     break;
  8.   case 30:
  9.     normal_months ++;
  10.     break;
  11.   case 28:
  12.   case 29:
  13.     short_months ++;
  14.     break;
  15.   default:
  16.     cout << "month has fewer than 28 or more than 31 days" << endl;
  17.     break;
  18. }

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)
gongqijuns 发表于 2024-7-11 16:40 | 显示全部楼层
当 case 值不是连续的或者分布不均匀时,编译器可能会使用比较链(也称为 if-else-if 链)来实现 switch 语句。这种方式涉及到一系列的比较操作,直到找到匹配的 case 值
yuliangren 发表于 2024-7-11 17:46 | 显示全部楼层
将最有可能匹配的 case 值放在前面,这样可以减少平均比较次数,提高性能
canfeil 发表于 2024-7-11 18:51 | 显示全部楼层
如果 case 值是小的连续整数,编译器更有可能使用跳转表,这是一种非常高效的实现方式
清芯芯清 发表于 2024-7-12 08:33 | 显示全部楼层
尽量使用简单的整数值作为 case 值,避免使用复杂的表达式,因为这会增加编译器的优化难度
nqty 发表于 2024-7-12 09:42 | 显示全部楼层
确保有一个 default 分支来处理未预料到的情况,这样可以提高代码的健壮性
miltk 发表于 2024-7-12 10:44 | 显示全部楼层
我觉得都差不多,但是楼主说的确实是比较好的方式
twinkhahale 发表于 2024-7-12 13:00 | 显示全部楼层
一般来说,就是优先把可能实现的条件放最初的地方,提高执行效率
您需要登录后才可以回帖 登录 | 注册

本版积分规则

350

主题

2689

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部