【发布时间】:2013-06-25 01:11:19
【问题描述】:
由于虚拟调用需要对 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;
}
【问题讨论】:
-
1.在您提出此类问题之前,请先分析代码。你基本上说的是“为我分析代码”。 2.查找编译时多态性。
-
旧但可能对您很感兴趣:codeproject.com/Articles/7150/…
-
是的,我打算分析代码,但我很好奇性能上是否存在任何概念差异
-
“为什么它没有更普遍?”出于同样的原因,汇编语言和 Brainf*** 并不普遍......哦,而且速度更慢。
-
您需要为每个对象存储一个函数指针而不是每个类一个函数指针(可能)节省一次缓存未命中和失去不变性(即可预测性)的函数指针。我确信这种权衡已经被反复测量,以达到虚拟调用的通用实现。或者,所有 C++ 实现者都是傻瓜,根本没想过这样做,但我对此表示怀疑。
标签: c++ performance function-pointers virtual-functions vtable