Насколько дороги динамические приведения в С++?
Для моего API-интерфейса GUI, который работает с различными бэкендами (sdl, gl, d3d и т.д.), я хочу динамически отображать родовое изображение типа, каким бы оно ни было.
Итак, в нижней строке, я бы делал около 20 * 60 кадров в секунду динамических бросков в секунду.
Насколько дорогой динамический бросок? Отмечу ли я, что это оказывает заметное негативное влияние на производительность? Какие у меня альтернативы, которые все еще поддерживают приемлемый уровень производительности?
Ответы
Ответ 1
1200 dynamic_cast
в секунду вряд ли будет серьезной проблемой производительности. Вы делаете один dynamic_cast
для каждого изображения или целую последовательность операторов if
, пока не найдете фактический тип?
Если вы беспокоитесь о производительности, самыми быстрыми способами реализации полиморфизма являются:
- --- самый быстрый ---
- Перегрузка функций (только полиморфизм времени компиляции)
- CRTP (только для полиморфизма времени компиляции)
- Теги, переключатели и статические приведения (хрупкие, не поддерживают многоуровневое наследование, головную боль, которая не рекомендуется для нестабильного кода)
- Виртуальные функции
- Шаблон посетителя (инвертированная виртуальная функция)
- --- почти так же быстро ---
В вашей ситуации шаблон посетителя, вероятно, лучший выбор. Это два виртуальных вызова вместо одного, но позволяет сохранить реализацию алгоритма отдельно от структуры данных изображения.
Ответ 2
Не можете ли вы определить свой собственный бросок, используя #define, который использует dynamic_cast в сборке отладки (так что вы знаете, что ваш актер корректен) и делает простой (MySubclass *) бросок в сборке релизов, поэтому нет стоимости исполнения?
Ответ 3
В этом конкретном случае вы должны иметь возможность организовать свой код, чтобы dynamic_cast был нужен только один раз. Я полагаю, что бэкэнд не меняется динамически.
Ответ 4
Я думаю, что это зависит от контекста. Некоторые ссылки, которые помогут вам
http://compgroups.net/comp.lang.c++/dynamic_cast-expensive и
http://www.gamedev.net/topic/155192-dynamic_cast--or-ordinary-cast/