27

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

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

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

4

4 に答える 4

21

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:

そうでない場合は、「条件のシーケンスよりも優れている」ことをある程度許容する他の可能な実装があります。

于 2012-12-28T09:53:46.180 に答える
11

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

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

通常、switch は if-else シーケンスよりもはるかに読みやすいものです。

于 2012-12-28T10:05:01.100 に答える
1

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

コメント大歓迎です..

于 2012-12-28T10:01:23.070 に答える