問題タブ [jump-table]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - gotoラベルを配列に格納してから、それらにジャンプするにはどうすればよいですか?
「ジャンプラベル」の配列を宣言したい。
次に、この配列の「ジャンプラベル」にジャンプします。
しかし、私はこれをどのように行うのか分かりません。
次のコードのようになります。
誰かがこれを実行する方法を知っていますか?
c++ - Switch-Case: 初期化を伴う宣言 & 宣言と代入
switch-case ステートメントでは、declaration-with-initializationは無効ですが、declaration-and-then-assignmentは許可されています。次のコード スニペットに示すように。
コンパイラ側から見たこれら 2 種類の初期化の違いは何ですか? また、最初のタイプの初期化が無効で、2 番目のタイプが有効なのはなぜですか。
c++ - 「デフォルト」スイッチケースはジャンプテーブルの最適化を妨げますか?
私のコードでは、セマンティクスが変更された場合にスイッチを更新するのを忘れないように、次のようなアサートを含むフォールバックのデフォルト ケースを記述することに慣れています。
人為的なフォールバック チェックのデフォルト ケースがジャンプ テーブルの生成に干渉するかどうか疑問に思っています。コンパイラがテーブルに最適化できるように、「ModeA」や「ModeB」などが連続していると想像してください。「デフォルト」ケースには実際の「return」ステートメントが含まれているため (リリース モードでアサートが消え、コンパイラーが return ステートメントの欠落についてうめき声を上げるため)、コンパイラーがデフォルト ブランチを最適化する可能性は低いようです。
これを処理する最良の方法は何ですか? 一部の友人は、未定義の動作が存在する場合にコンパイラが return ステートメントの欠落に関する警告を省略できるように、"ADummyValue" を null ポインター逆参照に置き換えることを勧めてくれました。これを解決するためのより良い方法はありますか?
c - C で x86 スタイルのジャンプ テーブルを使用する
私はこのようにCでジャンプテーブルをやろうとしています
など
私はこれで始めました
しかし、うまく機能していません..
c - 「switch」は「if」より速いですか?
ステートメントは実際にswitch
ステートメントよりも高速ですか?if
以下のコードを Visual Studio 2010 の x64 C++ コンパイラで/Ox
フラグを付けて実行しました。
これらの結果を得ました:
Switch ステートメント: 5261 ミリ秒
If ステートメント: 5196 ミリ秒
私が学んだことから、switch
ステートメントは明らかにジャンプ テーブルを使用して分岐を最適化します。
質問:
x86 または x64 では、基本的なジャンプ テーブルはどのようになりますか?
このコードはジャンプ テーブルを使用していますか?
この例でパフォーマンスの違いがないのはなぜですか? パフォーマンスに大きな違いがある状況はありますか?
コードの分解:
アップデート:
ここで興味深い結果が得られました。ただし、なぜ一方が速く、もう一方が遅いのかはわかりません。
c - C でのジャンプ テーブルの例
ジャンプ台の使用例をいくつか教えてください。私はウィキペディアでこの例を見ました:
しかし、示されているようにインデックスを使用する代わりに関数を呼び出す別の方法があるかどうか疑問に思っていました.上記の場合はjump_table[value]();
私が達成したいのは、インデックスを使用する代わりに、関数自体の名前を使用する方法があるということです。
たとえば、構造体にすべての関数ポインターがあるとします。
そして今、関数を呼び出したいときに、次のようなことができますfuncptrs.func1()
か?
c++ - c スイッチとジャンプ テーブル
c/c++ の switch ステートメントがジャンプ テーブルにコンパイルされることがあると理解しています。私の質問は、それを保証するための経験則はありますか?
私の場合、私は次のようなことをしています:
1 から n までのすべてのケースを順番にカバーします。ジャンプテーブルにコンパイルされると想定しても安全ですか? 元のコードは長くて厄介なif else
ステートメントだったので、少なくともある程度は読みやすくなりました。
c - ジャンプ テーブルとコード ポインタ
私のコードは次のようになります: (n は 0、1、2、3 の数字で、loc_A/B/C/D はそれぞれコードのブロックを表します)
「&&loc_A」は何の略ですか? loc_A が表すコードのアドレス (または場所) ですか?