問題タブ [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++ - C/C++ で繰り返される単純なスイッチケースを避けますか?
非常に単純な目的を持つコードをインターネット上で見つけましたが、それは醜いアプローチを使用しています。おそらく、作成者はスイッチケースを使用して、以前に定義された Enum のいくつかの (連続していない) 値がそのスコープに属しているかどうかを判断しています。そうであれば、関数は戻りtrue
、それだけです。それ以外の場合は、 を返しますfalse
。
実際には次のようになります。
switch ケースの使用は、コンパイラによって生成されたジャンプ テーブルのおかげで瞬時にルックアップできることで正当化されます (ただし、ジャンプ テーブルは、私が収集したものからの瞬時のルックアップを必ずしも意味するわけではありません)。それでも、無数の不要なコード行が生成されます。
関数のインライン化と関数ポインターの配列の使用について読んだことがありますが、そのような特定のケースでそれを使用する方法がわかりません。
このような単純なケース (しゃれは意図されていません) で何行も書かないようにするにはどうすればよいですか?case X:
c - ARM のコード内でケースのジャンプ テーブル位置を切り替える
C/C++ では、switch ステートメントはコンパイラによってジャンプ テーブルに下げられます。ARM と x86 のジャンプ テーブルの配置の違いに気付きました。
x86
x86 (および x86_64) の場合、ジャンプ テーブルは関数の外に配置されることがよくあります (例: .rodata)。
腕
ARM の場合、ジャンプ テーブルは関数のコードとインターリーブされます。
上記のコードは で生成されましclang 3.5 -target arm-none-eabi -march=armv7
たが、同様のコードが で生成されgcc
ます。
MIPS
完全を期すために、MIPS の switch ステートメントのコードを次に示します。ジャンプ台は.rodata
セクションに配置されます。
jumptable ( 0x00401848
) のアドレスは にあり.rodata
ます。
上記のコードは、clang 3.9 で生成されました。
質問
ARM アーキテクチャではジャンプ テーブルが関数のコードとインターリーブされることが多く、x86 ではインターリーブされないのはなぜですか?
この答えは、キャッシュがARMで動作する方法がそれと関係があることを意味します。他の理由はありますか?
vba - VBA for Excel でジャンプ テーブルを作成できますか?
Select Case
複数のステートメントを使用して EDI (830) ドキュメントを処理し、実行するコードを決定する単純なトランスレーター/パーサーを作成しました。バイナリ モードでファイルを開き、ドキュメントを個々の行に分割すると、各行はさまざまな要素に分割され、各行の最初の要素には一意のセグメント識別子が含まれます。
私のコードは、書かれたとおりに完全に機能します。ただし、一致が見つかるか実行されるまで、Select Case
毎回チェックする必要があります。コードが実際に実行される前の「チェック」の数を最小限に抑えるために、(ループの場合のように) 最も頻繁に現れるセグメントが最初に配置されるように、ステートメントを順序付けました。Case
Case Else
Case
複数の を使用するよりもSelect Case
、セグメント ID のインデックスを決定し、そのインデックスを使用して適切なルーチンを呼び出すことをお勧めします。私は C と Assembler でジャンプ テーブルを使用してきましたが、VBA でも同様の機能が可能であると予想していました。