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瀏覽量
61741 -
C語言
+關注
關注
183文章
7644瀏覽量
145561 -
程序
+關注
關注
117文章
3846瀏覽量
85225 -
代碼
+關注
關注
30文章
4967瀏覽量
73954
發布評論請先 登錄
相關推薦
熱點推薦
高效的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
?2015次閱讀
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語句中,case關鍵字用來指定不同的取值。 在Java
oracle case when 語法介紹
Oracle的CASE WHEN語法是一種在數據庫查詢中使用的條件語句,它提供了一種在SELECT語句中根據條件對結果進行轉換或篩選的方法。在本文中,我們將詳細介紹Oracle的CASE WHEN
Switch case中的case順序
評論