2017-02-09 14 views
6

switchステートメントはどのようにしてメモリ内の正しい場所にすぐにドロップされますか?ネストされたifステートメントでは、それぞれのステートメントとの比較を実行する必要がありますが、switchステートメントでは正しいケースに直接進みます。これはどのように実装されていますかSwitchステートメントの動作方法

+6

あなたのコンパイラは、生成したアセンブリコードを表示するフラグを持っている可能性があります...スポイラー:if-sの束とほぼ同じです。 –

+1

あなたはそれがどういう考えをしていますか?そして 'もし'は?標準があなたの主張を支持するところへの参照を提供してください。 – Olaf

+0

@DavidConnolly:答えを受け入れることができますか? – chqrlie

答えて

15

switchステートメントをマシンコードにコンパイルするには、さまざまな方法があります。ここではいくつかある:

  • コンパイラは約ログ(N)試験はN可能間の値をディスパッチするのに十分であるように非効率的でない一連のテストを生成することができケース。

  • コンパイラは、値とジャンプアドレスのテーブルを作成し、汎用検索コード(直線または二分の一、bsearch()に似ています)で使用し、最後に対応する場所にジャンプします。

  • コンパイラは、スイッチの値がすべての大文字と小文字の値を含む範囲内にあるかどうかをチェックし、対応するアドレスに直接ジャンプするジャンプアドレスとコードの表を生成できます。これはおそらくあなたの説明に最も近い実装です:ですが、switchステートメントでは、正しいケースに直接移動します。ターゲットCPU、コンパイラ設定の特定の能力に応じて、数やケース値の分布は、コンパイラは、上記のいずれかの方法または別の、またはそれらの組み合わせ、あるいはいくつかを使用する場合があります

他の方法。

コンパイラの設計者は、これらの選択肢のヒューリスティックを向上させるために多大な努力を払っています。アセンブリの出力を参照するか、Godbolt's Compiler Explorerなどのオンラインツールを使用して、さまざまなコード生成の可能性を確認してください。

関連する問題