Подтвердить что ты не робот

Насколько дороги динамические приведения в С++?

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

Итак, в нижней строке, я бы делал около 20 * 60 кадров в секунду динамических бросков в секунду.

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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