ループ内で仮想メソッドを何度も呼び出す必要がある関数があり、毎回vtableルックアップのオーバーヘッドを回避する方法があることを望んでいました。メソッドへのポインタを取得することは、これを回避するための良い方法だと思いました。以下のコードは、私がやろうとしていることを示しています。問題は、のメソッドのアドレスをメンバー関数ポインターDerived
に割り当てることができないことです。Base
class Base
{
public:
typedef float ( Base::*MFP )( float const & x ) const;
virtual MFP getMFP( void ) const = 0;
virtual float function( float const & x ) const = 0;
};
class Derived : public Base
{
public:
virtual MFP getMFP( void ) const
{
return &Derived::function;
}
virtual float function( float const & x ) const
{
return x * x;
}
};
class Other
{
public:
float calculate( float const & x, Base * pBase ) const
{
Base::MFP function = pBase->getMFP();
return ( ( *pBase ).*( function ) )( x );
}
};
私がここでやろうとしていることをする方法はありますか?
編集:
まだ興味がある人のために、私は自分のコードの時限テストを実行しました。動的ディスパッチは私の計算方法を0.004%遅くしただけなので、ほとんど何もありません。完全に最適化されたMSVC2010を使用してコンパイルされました。