Дорогой dynamic_cast
используется вместо более эффективного static_cast
или const_cast
Этот дефект повышен когда dynamic_cast
используется на указателе, который затем сразу разыменовывается. Например:
std::iostream* iostream_ptr; //... std::string str = dynamic_cast< std::stringstream* >( iostream_ptr )->str();
iostream
указатель iosreeam_ptr
брошен в stringstream
указатель, и затем сразу разыменованный. Такое использование подразумевает, что кастинг всегда успешно выполняется. Когда вы знаете, что операция кастинга успешно выполняется, static_cast
или const_cast
более эффективный выбор.При кастинге одного класса другому в полиморфной иерархии вы можете хотеть использовать dynamic_cast
когда тип выполнения большей части производного класса в иерархии неизвестен. dynamic_cast
более мощно, потому что это проверяет тип аргумента во время выполнения и сообщает об ошибке, если проверка перестала работать. Это дополнительные функциональности делает dynamic_cast
более дорогая операция, чем любой из static_cast
или const_cast
. Поскольку dynamic_cast
универсально, его использование может сделать код более трудным понять. Используя dynamic_cast
когда более дешевые или более явные операции кастинга могут быть более соответствующими результатами в коде, который является неэффективным и более трудным обеспечить. Поскольку такой код скомпилировал и запустил правильно, неэффективность может остаться необнаруженной.
Чтобы зафиксировать этот дефект, замените dynamic_cast
с более соответствующей более дешевой опцией. Например:
При вызывании виртуальных функций в полиморфном базовом классе удалите любую операцию кастинга.
Когда downcasting от базового класса до производного класса, используйте static_cast
если операция кастинга преуспевает во всех условиях.
Когда sidecasting от одного базового класса до другого базового класса, используйте static_cast
если операция кастинга преуспевает во всех условиях.
Когда upcasting от производного класса до базового класса, используйте static_cast
.
Изменить const
или volatile
спецификаторы объекта, используйте const_cast
.
Осуществите рефакторинг свой код, чтобы удалить несоответствующий кастинг, такой как кастинг между несвязанными классами.
Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.
Группа: Производительность |
Язык: C++ |
Значение по умолчанию: Off |
Синтаксис командной строки:
EXPENSIVE_DYNAMIC_CAST |
Удар: Средняя |