Ваш вопрос недавно обсуждался в списке рассылки rabbitmq-users
: , ссылка .
Я рекомендую прочитать.
Что касается вопроса №2, не беспокойтесь о дополнительном прыжке, если у вас нет доказательств, что он вызывает проблемы для вас.
ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает список рассылки rabbitmq-users
и только иногда отвечает на вопросы о StackOverflow.
Я соглашаюсь с m-sharp, что Вы не собираетесь избегать полиморфизма во время выполнения.
При оценке оптимизации по элегантности попытайтесь заменить, говорят
void invoke_trivial_on_all(const std::vector<Base*>& v)
{
for (int i=0;i<v.size();i++)
v[i]->trivial_virtual_method();
}
с чем-то как
void invoke_trivial_on_all(const std::vector<Base*>& v)
{
for (int i=0;i<v.size();i++)
{
if (v[i]->tag==FooTag)
static_cast<Foo*>(v[i])->Foo::trivial_virtual_method();
else if (v[i]->tag==BarTag)
static_cast<Bar*>(v[i])->Bar::trivial_virtual_method();
else...
}
}
это не симпатично, конечно, не ООП (больше возвращение к тому, что Вы могли бы сделать в старом добром 'C'), но если виртуальные методы достаточно тривиальны, необходимо получить функцию без вызовов (подвергающийся достаточно хорошему компилятору и опциям оптимизации). Вариант с помощью dynamic_cast или идентификатор типа мог бы быть немного более изящным/безопасным, но остерегаться этого, те функции имеют свои собственные издержки, которые, вероятно, сопоставимы с виртуальным вызовом так или иначе.
Где Вы будете, скорее всего, видеть, что улучшение от вышеупомянутого - то, если некоторые методы классов без операций в секунду, и оно сохранило Вас от вызова их, или если функции содержат общий инвариантный циклом код, и оптимизатору удается поднять его из цикла.
Можно пойти Ole C Маршрут и использовать объединения. Хотя это также может быть грязно.
Полиморфизм буквально означает несколько (poly) формы (морфы). На статически типизированных языках (таких как C++) существует три типа полиморфизма.
Если это не известно до времени выполнения, какие классы будут использоваться, необходимо использовать Полиморфизм Подтипа, который включит вызовы виртуальной функции.
Виртуальные вызовы метода имеют очень маленькую производительность наверху статически связанные вызовы. Я убедил бы Вас посмотреть на ответы на это ТАК вопрос.