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)好。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
Switch
+关注
关注
1文章
542浏览量
61975 -
C语言
+关注
关注
183文章
7646浏览量
146159 -
程序
+关注
关注
117文章
3848浏览量
85470 -
代码
+关注
关注
30文章
4976浏览量
74380
发布评论请先 登录
相关推荐
热点推荐
高效的C编程之Switch语句
14.6 Switch语句 编译器通常将C语言中的Switch语句编译一个查找表(Table Lookup)以便跳转到合适的入口处。 下面的例子显示了编译器如何处理程序中的Switch
发表于 10-17 16:55
•4次下载
C语言的switch case多分支选择语句的详细资料说明
1、switch-case开关语句是一种多分支选择语句,用来实现多方向条件分支。虽然采用if-else条件判断语句也可以实现多方向条件分支,但是当分支较多时,使用if-else条件语句的嵌套层次会
发表于 07-12 17:39
•1次下载
C语言switch中的case标签简析
最近在看一些开源的东西,发现switch中的case标识仅仅只是一个标签,跟使用goto语句所定义的label标签是类似的。
发表于 08-05 17:43
•2055次阅读
Verilog中的If语句和case语句介绍
。这些语句统称为顺序语句。case 语句和 if 语句都是 verilog 中顺序语句的示例。在这篇文章的其余部分,我们将讨论如何在verilog中使用这两个语句。然后,我们考虑这两个
CASE:创建多路分支
CASE:创建多路分支 说明 使用“创建多路分支”指令,可以根据表达式的值执行多个指令序列中的一个。 表达式的值必须为整数或位字符串。执行 CASE 指令时,会将表达式(变量)的值与多个常数的值进行
case后边可以跟多个语句吗
是的,"case" 后面可以跟多个语句。在编程语言中,"case" 通常被用于 switch 语句中,用于检查一个变量或表达式是否匹配某个特定的值。当匹配成功时,可以执行一个或多个语句。 下面是一个
java switch case的语法规则
在Java中,switch case语句是一种用于多分支选择的控制流语句。它允许根据某个表达式的值来执行不同的代码块。下面是关于switch cas
java switch case值能为枚举值吗
Java中的switch语句可以接受枚举类型的值作为参数。在Java中,枚举是一种特殊的数据类型,它定义了一个固定数量的命名常量。因此,可以将枚举值作为switch语句的
java switch case 能不能用字符串
fruit = "apple" ; switch (fruit) { case "apple" :System.out.println( "This is an apple." ); break ; case "orange"
java switch case怎么判断范围
Java中的switch语句是用来根据不同的情况执行不同的代码块。在使用switch语句时,通常需要使用一个变量来判断不同的范围。然而,switch语句默认只支持整数、字符和字符串类型
java中的switch语句 case的取值
Java中的switch语句是一种用于多重条件判断的语句,用于根据不同的条件执行不同的代码块。在switch语句中,case关键字用来指定不同的取值。 在Java
oracle case when 语法介绍
Oracle的CASE WHEN语法是一种在数据库查询中使用的条件语句,它提供了一种在SELECT语句中根据条件对结果进行转换或筛选的方法。在本文中,我们将详细介绍Oracle的CASE WHEN
Switch case中的case顺序
评论