switchステートメントはどのようにしてメモリ内の正しい場所にすぐにドロップされますか?ネストされたifステートメントでは、それぞれのステートメントとの比較を実行する必要がありますが、switchステートメントでは正しいケースに直接進みます。これはどのように実装されていますかSwitchステートメントの動作方法
6
A
答えて
15
switch
ステートメントをマシンコードにコンパイルするには、さまざまな方法があります。ここではいくつかある:
コンパイラは約ログ(N)試験はN可能間の値をディスパッチするのに十分であるように非効率的でない一連のテストを生成することができケース。
コンパイラは、値とジャンプアドレスのテーブルを作成し、汎用検索コード(直線または二分の一、
bsearch()
に似ています)で使用し、最後に対応する場所にジャンプします。コンパイラは、スイッチの値がすべての大文字と小文字の値を含む範囲内にあるかどうかをチェックし、対応するアドレスに直接ジャンプするジャンプアドレスとコードの表を生成できます。これはおそらくあなたの説明に最も近い実装です:ですが、switchステートメントでは、正しいケースに直接移動します。ターゲットCPU、コンパイラ設定の特定の能力に応じて、数やケース値の分布は、コンパイラは、上記のいずれかの方法または別の、またはそれらの組み合わせ、あるいはいくつかを使用する場合があります
他の方法。
コンパイラの設計者は、これらの選択肢のヒューリスティックを向上させるために多大な努力を払っています。アセンブリの出力を参照するか、Godbolt's Compiler Explorerなどのオンラインツールを使用して、さまざまなコード生成の可能性を確認してください。
関連する問題
- 1. Switchステートメント()
- 2. switchステートメント内のifステートメント?
- 3. Switchステートメント/ JS
- 4. AS3のswitch caseステートメントがXMLで正しく動作しない
- 5. javascriptのステートメントとswitchステートメントの場合
- 6. Switchステートメントと強制
- 7. C++ switchステートメントとシンボル
- 8. StringPropertyとSwitchステートメントJavafx
- 9. Switchステートメントの到達不能ステートメント
- 10. JavaのSwitchステートメント内での文字列の使用方法
- 11. C++(Switchステートメントの型エラー)
- 12. Java switchステートメント内のメソッドスコープ
- 13. SwitchステートメントのC++数式
- 14. AccessでSwitchステートメントの結果を増やす方法
- 15. SWITCHステートメントからメインのGUIスレッドにアクセスする方法は?
- 16. switchステートメントでtry catch recursionを繰り返す方法は?
- 17. switchステートメントで変数を使用する方法* updated *
- 18. switchステートメントでグローバルオブジェクトを宣言する方法
- 19. `switch`ステートメントは何ですか?
- 20. forループ内switchステートメントjavascript
- 21. SwitchまたはIfステートメント
- 22. switch文を作成する方法
- 23. MS Access + SQL - switchステートメントの左結合?
- 24. データタイプとswitch-caseステートメントの解決
- 25. Simulater/Generated switchステートメントの範囲を
- 26. switchステートメントのデフォルトでNotImplementedExceptionをスローする
- 27. 検索ステートメントをフィルタリングするためのSwitchステートメントの使用
- 28. switchステートメントを使用して複数ステップ/コンポーネントフォームを作成する
- 29. switch文の異常な動作
- 30. ng-switchとangle-input-modifiedの動作
あなたのコンパイラは、生成したアセンブリコードを表示するフラグを持っている可能性があります...スポイラー:if-sの束とほぼ同じです。 –
あなたはそれがどういう考えをしていますか?そして 'もし'は?標準があなたの主張を支持するところへの参照を提供してください。 – Olaf
@DavidConnolly:答えを受け入れることができますか? – chqrlie