由于虚拟调用需要对 v-table 进行额外的索引遵从,虚拟函数调用可能会很慢,这可能导致数据缓存未命中以及指令缓存未命中……对于性能关键的应用程序不利。
所以我一直在想一种方法来克服虚函数的性能问题,但仍然具有虚函数提供的一些相同功能。
我相信这已经完成了,但是我设计了一个简单的测试,它允许基类存储一个可以由任何派生类设置的成员函数指针。当我在任何派生类上调用 Foo() 时,它将调用适当的成员函数,而无需遍历 v-table ...
我只是想知道这种方法是否可以替代虚拟调用范式,如果是,为什么它没有更普遍?
在此先感谢您的时间!:)
class BaseClass
{
protected:
// member function pointer
typedef void(BaseClass::*FooMemFuncPtr)();
FooMemFuncPtr m_memfn_ptr_Foo;
void FooBaseClass()
{
printf("FooBaseClass() \n");
}
public:
BaseClass()
{
m_memfn_ptr_Foo = &BaseClass::FooBaseClass;
}
void Foo()
{
((*this).*m_memfn_ptr_Foo)();
}
};
class DerivedClass : public BaseClass
{
protected:
void FooDeriveddClass()
{
printf("FooDeriveddClass() \n");
}
public:
DerivedClass() : BaseClass()
{
m_memfn_ptr_Foo = (FooMemFuncPtr)&DerivedClass::FooDeriveddClass;
}
};
int main(int argc, _TCHAR* argv[])
{
DerivedClass derived_inst;
derived_inst.Foo(); // "FooDeriveddClass()"
BaseClass base_inst;
base_inst.Foo(); // "FooBaseClass()"
BaseClass * derived_heap_inst = new DerivedClass;
derived_heap_inst->Foo();
return 0;
}