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文章
533瀏覽量
58166 -
C語言
+關注
關注
180文章
7601瀏覽量
136251 -
程序
+關注
關注
116文章
3778瀏覽量
80861 -
代碼
+關注
關注
30文章
4753瀏覽量
68368
發布評論請先 登錄
相關推薦
評論