[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6 メンバ関数への束縛ポインタから関数ポインタを取り出す

C++ では、メンバ関数へのポインタ(pointer to member function, PMF) は ワイドポインタとでも呼ぶべきものを使って、可能な呼出し機構を全て 扱うように実装されている。PMF は、‘this’ ポインタの調整方法や、 指し示されている関数が仮想であれば vtable のある場所、さらには そのメンバ関数が vtable のどこにあるかといった情報を格納する必要がある。 内側のループで PMF を使っている場合、その決定を本当に考え直したほうが良い。 選択の余地がないのであれば、指定されたオブジェクト/PMF のペアに 対して呼ばれる関数へのポインタを取り出して、ループの内側で 直接それを呼び出せば、幾らか実行時間の節約になる。

関数ポインタ経由の呼出しには以前としてペナルティが課されるということに 注意して欲しい。現代のほとんどのアーキテクチャでは、 このような呼出しは CPU の分岐予測機能を無効にしてしまう。 これは通常の仮想関数呼出しにも当てはまる。

この拡張の構文は以下の通り。

 
extern A a;
extern int (A::*fp)();
typedef int (*fptr)(A *);

fptr p = (fptr)(a.*fp);

この拡張を使うには ‘-Wno-pmf-conversions’ を指定しなければならない。


This document was generated using texi2html 1.78.