次のコードをアセンブリにコンパイルする方法に違いがあるかどうか疑問に思っていました。switch-case は if else よりも効率的であると聞いたことがありますが、この例では、それが当てはまるかどうかはよくわかりません。
if(x==1){
...
}else if(x==2){
...
}else{
...
}
と
switch(x){
case 1:
...
break;
case 2:
...
break;
default:
...
}
次のコードをアセンブリにコンパイルする方法に違いがあるかどうか疑問に思っていました。switch-case は if else よりも効率的であると聞いたことがありますが、この例では、それが当てはまるかどうかはよくわかりません。
if(x==1){
...
}else if(x==2){
...
}else{
...
}
と
switch(x){
case 1:
...
break;
case 2:
...
break;
default:
...
}
エントリが連続している (またはほぼ連続している) 場合、コンパイラはスイッチをジャンプテーブルに変えることがあります。または、理論的には、線形の一連のテストの代わりにバイナリ検索を使用してケースを見つけることができます。これは、多数のケースがある場合に高速になります。
一方、コンパイラが if/else に変換された同じコードに対して同じ最適化を行うのを止めるものは何もありません。
そのため、優れたコンパイラでは、場合によっては switch が高速になります。非常に優れたコンパイラでは、それらは同じになります。
この特定のケースでは、をswitch
ジャンプ テーブルに変えることができます。if
ステートメント ( =
as :-P と記述した場合) は、コンパイラーが句間で変更されていないこと==
を認識できれば、同じことを行うことができます( isまたは何かでない限り、通常はそうです)。x
if
x
volatile
特定のケースが他のケースよりも可能性が高いことがわかっている場合は、if/else コンストラクトがより効率的になる可能性があることにも注意してください。