web-dev-qa-db-ja.com

Switch caseステートメントはどのように実装または内部で機能しますか?

switchステートメントが「バイナリ検索」またはいくつかの並べ替え手法を使用して正しいケースを正確に選択し、これにより、else-ifラダーと比較してパフォーマンスが向上することをどこかで読みました。

また、ケースを順番に指定すると、スイッチはより速く機能しますか?そうですか?これについてあなたの貴重な提案を追加できますか?

ここ ほぼ同じことについて話し合い、質問として投稿する予定でした。

24
2vision2

switchステートメントがコードでどのように実現されるかは、実際にはコンパイラー次第です。

しかし、私の理解では、それが適切な場合(つまり、比較的密度の高い場合)、ジャンプテーブルが使用されます。

これは、次のようなことを意味します。

switch(i) {
  case 0: doZero(); break;
  case 1: doOne();
  case 2: doTwo(); break;
  default: doDefault();
}

(恐ろしい疑似アセンブラですが、はっきりしているはずですが)のようなものにコンパイルされることになります。

load i into REG
compare REG to 2
if greater, jmp to DEFAULT
compare REG to 0
if less jmp to DEFAULT
jmp to table[REG]
data table
  ZERO
  ONE
  TWO
end data
ZERO: call doZero
jmp END
ONE: call doOne
TWO: call doTwo
jmp END
DEFAULT: call doDefault
END:

そうでない場合は、「一連の条件文よりも優れた」ある程度を可能にする他の可能な実装があります。

19
Vatine

Swtichの実装方法は、使用している値によって異なります。範囲が近い値の場合、コンパイラは通常、ジャンプテーブルを生成します。値が大きく離れている場合は、バイナリ検索などを使用して適切な値を見つけることにより、リンクされたブランチが生成されます。

Switchステートメント自体の順序は重要ではありません。昇順、降順、またはランダムな順序のいずれであっても同じことを行います。実行したいことに関して最も意味のあることを実行します。

他に何もないとしても、スイッチは通常、if-elseシーケンスよりもはるかに読みやすいです。

9
Mats Petersson

いくつかのグーグルで、私はいくつかの興味深いリンクを見つけ、私の質問への回答として投稿する予定でした。 http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem

コメントは大歓迎です。

1
2vision2