Там альтернативы к полиморфизму в C++?

Ваш вопрос недавно обсуждался в списке рассылки rabbitmq-users: , ссылка .

Я рекомендую прочитать.

Что касается вопроса №2, не беспокойтесь о дополнительном прыжке, если у вас нет доказательств, что он вызывает проблемы для вас.


ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает список рассылки rabbitmq-users и только иногда отвечает на вопросы о StackOverflow.

8
задан Community 23 May 2017 в 12:13
поделиться

3 ответа

Я соглашаюсь с 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 или идентификатор типа мог бы быть немного более изящным/безопасным, но остерегаться этого, те функции имеют свои собственные издержки, которые, вероятно, сопоставимы с виртуальным вызовом так или иначе.

Где Вы будете, скорее всего, видеть, что улучшение от вышеупомянутого - то, если некоторые методы классов без операций в секунду, и оно сохранило Вас от вызова их, или если функции содержат общий инвариантный циклом код, и оптимизатору удается поднять его из цикла.

3
ответ дан 5 December 2019 в 08:26
поделиться

Можно пойти Ole C Маршрут и использовать объединения. Хотя это также может быть грязно.

-1
ответ дан 5 December 2019 в 08:26
поделиться

Полиморфизм буквально означает несколько (poly) формы (морфы). На статически типизированных языках (таких как C++) существует три типа полиморфизма.

  1. Специальный полиморфизм: Это лучше всего рассматривается в C++ как перегрузка функции и перегрузка метода. То же имя функции свяжет с различными методами на основе соответствия типу времени компиляции параметров вызова к функциональной или сигнатуре метода.
  2. Параметрический полиморфизм: В C++ это - шаблоны и все забавные вещи, которые можно сделать с ним, такие как CRTP, специализация, частичная специализация, метапрограммирование и т.д. Снова этот вид полиморфизма, где то же шаблонное имя может сделать разные вещи на основе шаблонных параметров, является полиморфизмом времени компиляции.
  3. Полиморфизм подтипа: Наконец это - то, о чем мы думаем, когда мы слышим полиморфизм слова в C++. Это - то, где производные классы переопределяют виртуальные функции для специализации поведения. Тот же тип указателя на базовый класс может иметь другое поведение на основе конкретного производного типа, на который это указывает. Это - способ получить полиморфизм времени выполнения в C++.

Если это не известно до времени выполнения, какие классы будут использоваться, необходимо использовать Полиморфизм Подтипа, который включит вызовы виртуальной функции.

Виртуальные вызовы метода имеют очень маленькую производительность наверху статически связанные вызовы. Я убедил бы Вас посмотреть на ответы на это ТАК вопрос.

18
ответ дан 5 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: