Я пытаюсь понять, какая реализация ниже "быстрее". Предположим, что этот код компилируется с флагом -DVIRTUAL и без него.
Я предполагаю, что компиляция без -DVIRTUAL будет быстрее, потому что:
a] vtable не используется
b] Компилятор может оптимизировать инструкции по сборке, потому что он «точно» знает, какой вызов будет сделан с учетом различных опций (существует только конечное число опций).
Мой вопрос ТОЛЬКО связан со скоростью, а не с красивым кодом.
a] Я прав в своем анализе выше?
b] Будет ли комбинация предиктор ветки / компилятор достаточно разумной, чтобы оптимизировать ее для данной ветви оператора switch? Смотрите, что "тип" является const int.
c] Есть ли другие факторы, которые я упускаю?
Спасибо!
#include <iostream>
class Base
{
public:
Base(int t) : type(t) {}
~Base() {}
const int type;
#ifdef VIRTUAL
virtual void fn1()=0;
#else
void fn2();
#endif
};
class Derived1 : public Base
{
public:
Derived1() : Base(1) { }
~Derived1() {}
void fn1() { std::cout << "in Derived1()" << std::endl; }
};
class Derived2 : public Base
{
public:
Derived2() : Base(2) { }
~Derived2() { }
void fn1() { std::cout << "in Derived2()" << std::endl; }
};
#ifndef VIRTUAL
void Base::fn2()
{
switch(type)
{
case 1:
(static_cast<Derived1* const>(this))->fn1();
break;
case 2:
(static_cast<Derived2* const>(this))->fn1();
break;
default:
break;
};
}
#endif
int main()
{
Base *test = new Derived1();
#ifdef VIRTUAL
test->fn1();
#else
test->fn2();
#endif
return 0;
}