問題タブ [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.

0 投票する
11 に答える
11217 参照

c++ - gotoラベルを配列に格納してから、それらにジャンプするにはどうすればよいですか?

「ジャンプラベル」の配列を宣言したい。

次に、この配列の「ジャンプラベル」にジャンプします。

しかし、私はこれをどのように行うのか分かりません。

次のコードのようになります。

誰かがこれを実行する方法を知っていますか?

0 投票する
2 に答える
3976 参照

c++ - Switch-Case: 初期化を伴う宣言 & 宣言と代入

switch-case ステートメントでは、declaration-with-initializationは無効ですが、declaration-and-then-assignmentは許可されています。次のコード スニペットに示すように。

コンパイラ側から見たこれら 2 種類の初期化の違いは何ですか? また、最初のタイプの初期化が無効で、2 番目のタイプが有効なのはなぜですか。

0 投票する
7 に答える
1980 参照

c++ - 「デフォルト」スイッチケースはジャンプテーブルの最適化を妨げますか?

私のコードでは、セマンティクスが変更された場合にスイッチを更新するのを忘れないように、次のようなアサートを含むフォールバックのデフォルト ケースを記述することに慣れています。

人為的なフォールバック チェックのデフォルト ケースがジャンプ テーブルの生成に干渉するかどうか疑問に思っています。コンパイラがテーブルに最適化できるように、「ModeA」や「ModeB」などが連続していると想像してください。「デフォルト」ケースには実際の「return」ステートメントが含まれているため (リリース モードでアサートが消え、コンパイラーが return ステートメントの欠落についてうめき声を上げるため)、コンパイラーがデフォルト ブランチを最適化する可能性は低いようです。

これを処理する最良の方法は何ですか? 一部の友人は、未定義の動作が存在する場合にコンパイラが return ステートメントの欠落に関する警告を省略できるように、"ADummyValue" を null ポインター逆参照に置き換えることを勧めてくれました。これを解決するためのより良い方法はありますか?

0 投票する
3 に答える
2153 参照

c - C で x86 スタイルのジャンプ テーブルを使用する

私はこのようにCでジャンプテーブルをやろうとしています

など

私はこれで始めました

しかし、うまく機能していません..

0 投票する
12 に答える
64198 参照

c - 「switch」は「if」より速いですか?

ステートメントは実際にswitchステートメントよりも高速ですか?if

以下のコードを Visual Studio 2010 の x64 C++ コンパイラで/Oxフラグを付けて実行しました。

これらの結果を得ました:

Switch ステートメント: 5261 ミリ秒
If ステートメント: 5196 ミリ秒

私が学んだことから、switchステートメントは明らかにジャンプ テーブルを使用して分岐を最適化します。

質問:

  1. x86 または x64 では、基本的なジャンプ テーブルはどのようになりますか?

  2. このコードはジャンプ テーブルを使用していますか?

  3. この例でパフォーマンスの違いがないのはなぜですか? パフォーマンスに大きな違いある状況はありますか?


コードの分解:



アップデート:

ここで興味深い結果が得られました。ただし、なぜ一方が速く、もう一方が遅いのかはわかりません。

0 投票する
3 に答える
17722 参照

c - C でのジャンプ テーブルの例

ジャンプ台の使用例をいくつか教えてください。私はウィキペディアでこの例を見ました:

しかし、示されているようにインデックスを使用する代わりに関数を呼び出す別の方法があるかどうか疑問に思っていました.上記の場合はjump_table[value]();

私が達成したいのは、インデックスを使用する代わりに、関数自体の名前を使用する方法があるということです。

たとえば、構造体にすべての関数ポインターがあるとします。

そして今、関数を呼び出したいときに、次のようなことができますfuncptrs.func1()か?

0 投票する
2 に答える
8188 参照

c++ - c スイッチとジャンプ テーブル

c/c++ の switch ステートメントがジャンプ テーブルにコンパイルされることがあると理解しています。私の質問は、それを保証するための経験則はありますか?

私の場合、私は次のようなことをしています:

1 から n までのすべてのケースを順番にカバーします。ジャンプテーブルにコンパイルされると想定しても安全ですか? 元のコードは長くて厄介なif elseステートメントだったので、少なくともある程度は読みやすくなりました。

0 投票する
1 に答える
270 参照

c - ジャンプ テーブルとコード ポインタ

私のコードは次のようになります: (n は 0、1、2、3 の数字で、loc_A/B/C/D はそれぞれコードのブロックを表します)

「&&loc_A」は何の略ですか? loc_A が表すコードのアドレス (または場所) ですか?