マルチウェイ ブランチは、選択された基準に一致する値に基づいてプログラムの制御フローを変更することです。これは条件文の形式です。マルチウェイ ブランチは、特に生データから事前にインデックスが作成されている場合、プログラム ラベルセットの 1 つに制御を渡す最も効率的な方法であることがよくあります。
例
- ブランチテーブル
- Switch ステートメント - 下記の代替案も参照してください
- 多重ディスパッチ- サブルーチンが呼び出され、戻りが行われる場合
代替案
多方向分岐は、多くの場合、効率的なインデックステーブル検索(データ値自体またはデータ値の計算された導関数を配列のインデックスとして使用)に置き換えることができます[1]
「...スイッチ ステートメントの実装は、多方向分岐の実装と同じであるとみなされています。ただし、実際のコードでスイッチ ステートメントを使用する多くのケースでは、分岐を完全に回避し、スイッチを 1 つ以上のテーブル参照に置き換えることができます。たとえば、
Has30Days[前述の] 例は次のように実装できます:[C の例]」
「マルチウェイブランチコード生成のスーパーオプティマイザー分析」Roger Anthony Sayle 著
switch ( x ) { /* x は月番号 */ case 4 : /* 4月 */ case 6 : /* 6月 */ case 9 : /* 9月 */ case 11 : /* 11月 */ return true ; }
「セーフハッシュ」技術を使用して、次のように置き換えることができます。
unsigned int t = x | 2 ; switch ( t ) {ケース6 :ケース11 : trueを返す; }
または、インデックスマッピングテーブルルックアップを使用して、次のように 置き換えることもできます。
x %= 12 ; /* x が 0 から 11 の範囲にあることを確認する*/ static const int T [ 12 ] = { 0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 1 }; /* 0 ベースのテーブル 'if 30 days =1,else 0' */ return T [ x ]; /* ブール値 1 = true、0=false で返す */
(後者の場合の単純さを考慮すると、関数呼び出しを使用するオーバーヘッドがインデックス検索自体よりも大きくなる可能性があるため、インラインで実装することが望ましいでしょう。)
引用
マルチウェイ分岐は重要なプログラミング手法ですが、多くの場合、非効率的な if テストのシーケンスに置き換えられています。Peter Naur は最近、プログラム フローを制御するためのテーブルの使用は、ほとんど忘れ去られてきたコンピューター サイエンスの基本的な考え方であると考えていると私に書きました。しかし、彼は、この考え方がいつ再発見されるかは、いつか明らかになるだろうと期待しています。これは、私が研究したすべての優れたコンパイラの効率の鍵です。
— ドナルド・クヌース、『go to 文による構造化プログラミング』
参照
参考文献
- ^ 「アーカイブコピー」(PDF) 。 2012年2月27日時点のオリジナル(PDF)からアーカイブ。 2009年11月18日閲覧。
{{cite web}}: CS1 maint: アーカイブされたコピーをタイトルとして (リンク)
外部リンク
- HG Dietz によるカスタマイズされたハッシュ関数を使用した多方向分岐のコーディング
- Python を学ぶ Mark Lutz 著
- C++ プログラミング Nell B. Dale、Chip Weems 著
- Roger Anthony Sayle によるマルチウェイ ブランチ コード生成のスーパー最適化分析
