Switch case中的case順序
Switch 可能轉(zhuǎn)化成多種不同算法的代碼。其中最常見的是跳轉(zhuǎn)表和比較鏈/樹。當(dāng)switch用比較鏈的方式轉(zhuǎn)化時(shí),編譯器會(huì)產(chǎn)生if-else-if的嵌套代碼,并按照順序進(jìn)行比較,匹配時(shí)就跳轉(zhuǎn)到滿足條件的語(yǔ)句執(zhí)行。所以,可以對(duì)case的值依照發(fā)生的可能性進(jìn)行排序,把最有可能的放在第一位,這樣可以提高性能。
此外,在case中推薦使用小的連續(xù)的整數(shù),因?yàn)樵谶@種情況下,所有的編譯器都可以把switch 轉(zhuǎn)化成跳轉(zhuǎn)表。
不好的代碼:
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;
}
提升循環(huán)的性能
要提升循環(huán)的性能,減少多余的常量計(jì)算非常有用(比如,不隨循環(huán)變化的計(jì)算)。
不好的代碼(在for()中包含不變的if()):
for( i ...)
{
if( CONSTANT0 )
{
DoWork0( i );// 假設(shè)這里不改變CONSTANT0的值
}
else
{
DoWork1( i );// 假設(shè)這里不改變CONSTANT0的值
}
}
推薦的代碼:
if( CONSTANT0 )
{
for( i 。。。)
{
DoWork0( i );
}
}
else
{
for( i 。。。)
{
DoWork1( i );
}
}
如果已經(jīng)知道if()的值,這樣可以避免重復(fù)計(jì)算。雖然不好的代碼中的分支可以簡(jiǎn)單地預(yù)測(cè),但是由于推薦的代碼在進(jìn)入循環(huán)前分支已經(jīng)確定,就可以減少對(duì)分支預(yù)測(cè)的依賴。
選擇好的無(wú)限循環(huán)寫法
在編程中,我們常常需要用到無(wú)限循環(huán),常用的兩種方法是while (1)
和for (;;)
。這兩種方法效果完全一樣,但哪一種更好呢?讓我們看看它們編譯后的代碼。
編譯前:
while (1);
編譯后:
mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
編譯前:
for (;;);
編譯后:
jmp foo+23h
顯然,for (;;)
指令少,不占用寄存器,而且沒有判斷、跳轉(zhuǎn),比while (1)
好。
-
Switch
+關(guān)注
關(guān)注
1文章
535瀏覽量
59156 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7628瀏覽量
139953 -
程序
+關(guān)注
關(guān)注
117文章
3817瀏覽量
82243 -
代碼
+關(guān)注
關(guān)注
30文章
4883瀏覽量
70100
發(fā)布評(píng)論請(qǐng)先 登錄
LabVIEW中case結(jié)構(gòu)問題
(急求)LabVIEW中CASE問題
關(guān)于case 的順序問題,請(qǐng)小伙伴們指點(diǎn)指點(diǎn)
高效的C編程之Switch語(yǔ)句
C語(yǔ)言的switch case多分支選擇語(yǔ)句的詳細(xì)資料說明

C語(yǔ)言switch中的case標(biāo)簽簡(jiǎn)析

Verilog中的If語(yǔ)句和case語(yǔ)句介紹

CASE:創(chuàng)建多路分支

評(píng)論