Вызовы виртуальных функций могут быть медленными из-за того, что виртуальные вызовы требуют дополнительного индексированного уважения к 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;
}