仮想関数呼び出しは、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;
}