Извикванията на виртуални функции могат да бъдат бавни поради виртуалните извиквания, изискващи допълнително индексирано уважение към v-таблицата, което може да доведе до пропуск на кеш данни, както и пропуск на кеш на инструкции... Не е добре за критични за производителността приложения.
Така че мислех за начин да преодолея този проблем с производителността на виртуалните функции, но въпреки това да имам част от същата функционалност, която предоставят виртуалните функции.
Убеден съм, че това е правено и преди, но създадох прост тест, който позволява на базовия клас да съхранява указател на членска функция, който може да бъде зададен от всеки производен клас. И когато извикам Foo() на който и да е производен клас, той ще извика подходящата членска функция, без да се налага да преминава през v-таблицата...
Просто се чудя дали този метод е жизнеспособен заместител на парадигмата на виртуалното обаждане, ако е така, защо не е по-всеместно разпространен?
Благодаря предварително за отделеното време! :)
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;
}