Насколько дороги динамическое приведение в C ++? - PullRequest
26 голосов
/ 17 апреля 2011

Для моего GUI API, который работает с различными бэкэндами (sdl, gl, d3d и т. Д.), Я хочу динамически преобразовывать изображение универсального типа во что бы то ни было.

Итак, суть в том, что я буду делать около 20 * 60 кадров в секунду при динамическом приведении в секунду.

Насколько дорог динамический состав? Замечу ли я, что это оказывает заметное негативное влияние на производительность? Какие у меня есть альтернативы, которые все еще поддерживают приемлемый уровень производительности?

Ответы [ 3 ]

18 голосов
/ 17 апреля 2011

1200 dynamic_cast с в секунду вряд ли является основной проблемой производительности.Вы делаете один dynamic_cast на изображение или целую последовательность if операторов, пока не найдете фактический тип?

Если вы беспокоитесь о производительности, самые быстрые способы реализовать полиморфизм:

  • --- fast ---
  • Перегрузка функций (только полиморфизм во время компиляции)
  • CRTP (компилированиетолько время полиморфизма)
  • Теги, переключатели и статические преобразования (хрупкие, не поддерживают многоуровневое наследование, головная боль при обслуживании, поэтому не рекомендуется для нестабильного кода)
  • Виртуальные функции
  • Шаблон посетителя (инвертированная виртуальная функция)
  • --- почти так же быстро ---

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

0 голосов
/ 17 апреля 2011

В этом конкретном случае вы должны иметь возможность организовать свой код так, чтобы dynamic_cast был необходим только один раз. Я представляю, что бэкэнд не меняется динамически.

0 голосов
/ 17 апреля 2011

Разве вы не можете определить свое собственное приведение, используя #define, который использует dynamic_cast в отладочной сборке (так что вы знаете, что приведение правильное) и делает простое (MySubclass *) приведение в сборке выпуска, чтобы не было затрат на производительность?

...