【发布时间】:2012-06-26 19:53:43
【问题描述】:
我有一个函数需要在循环中多次调用虚方法,并希望有一种方法可以避免每次查找虚表的开销。我想也许获得一个指向该方法的指针是解决这个问题的好方法。下面的代码显示了我正在尝试做的事情,问题是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 编译。
【问题讨论】:
-
您需要进行 vtable 查找以确保调用正确的函数。这就是拥有虚函数的全部意义......
-
你分析过这段代码吗?是否明确地是 vtable 查找给您带来了性能问题?
-
你的编译器在某些情况下可以自己做(只做一次查找)。您是否验证了它输出的(优化的)程序集?
-
我还没有对其进行分析,开销可能不会那么大。这似乎是一个明显的优化,因为对象的类型不会改变,为什么在一次就足够的情况下执行十或二十次 vtable 查找?
标签: c++