Виртуальные вызовы функций могут быть медленными из-за виртуальных вызовов, требующих дополнительного индексированного отношения к таблице v, что может привести к промаху кэша данных, а также кэш кеша команд ... Не подходит для критически важных приложений.C++ virtual function vs function function pointer (сравнение производительности)
Итак, я подумывал о том, как преодолеть эту проблему производительности виртуальных функций, но при этом иметь ту же функциональность, что и виртуальные функции.
Я уверен, что это было сделано раньше, но я разработал простой тест, который позволяет базовому классу сохранять указатель на функцию-член, который может быть установлен любым производным классом. И когда я вызываю 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;
}
1. Профилируйте код, прежде чем задавать такие вопросы. То, что вы в основном говорите, это «профайл кода для меня». 2. Посмотрите на полиморфизм времени компиляции. –
Старый, но может быть интересен для вас: http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible – PlasmaHH
Да, я планирую профайл кода, но мне было любопытно если есть какие-либо концептуальные различия в производительности – eddietree