関数ポインタのテーブル
古い技らしい。
同じ引数と戻り値を持つ複数の関数を呼び分けたい時がある。
例として関数func1と関数func2を作成して、適当にコードを書いてみる。
sample1
refの値に応じてfunc1とfunc2がifを用いて呼び分けている。
ところが、上で示したコードは以下の様に書くことも出来る。
sample2
関数ポインタのテーブルに関数のアドレスを格納しておけば、refの値で
テーブルから関数のアドレスを取り出し、関数ポインタに代入し呼び出せる。
これをうまく使えば、引数と戻り値が一致している複数の関数を呼び分ける際に分岐を省くことが可能。
@ 利点 @
・見易い(慣れれば)
・分岐を省ける※
@ 欠点 @
・テーブルの参照値を注意しなければならない。
・分岐予測が出来ない※
※現在のCPUの多くはパイプラインを実装し、かつ
分岐予測
があるため、必ずしも良いパフォーマンスが得られるわけでは無いとさ。
分岐先関数アドレスをテーブルから引っ張り出して実行できるのはスマートだと思うし、
値によって分岐が多く存在する場合は強力な書き方。んが逆に、単一の関数に対しての使用は特殊な場合を除いて無意味。
最近のコンパイラだとswitch文の評価値が一定の範囲内であればジャンプテーブルをこさえるようで。
賢いなあ。
Back
2005/7/3 Gyabo