我有一个函数需要在循环中多次调用虚方法,并希望有一种方法可以避免每次都进行 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%,所以几乎没有。使用 MSVC 2010 编译并进行了全面优化。