Пожалуйста, соблюдайте приведенный ниже код. Насколько я знаю, dynamic_cast медленнее, чем static_cast. Потому что он оценивает тип во время выполнения.
Я сомневаюсь, что если мы будем использовать static_cast с typeid (), как показано ниже, это займет то же время, что и динамическое приведение?
Это будет быстрее, чем dynamic_cast?
class Shape
{
public:
virtual ~Shape(){}
};
class Circle : public Shape{ };
class Square : public Shape{ };
Статическая отливка с RTTI:
Circle c;
Shape* s = &c; // Upcast: normal and OK
// More explicit but unnecessary:
s = static_cast<Shape*>(&c);
// (Since upcasting is such a safe and common
// operation, the cast becomes cluttering)
Circle* cp = 0;
Square* sp = 0;
// Static Navigation of class hierarchies
// requires extra type information:
if(typeid(s) == typeid(cp)) // C++ RTTI
cp = static_cast<Circle*>(s);
if(typeid(s) == typeid(sp))
sp = static_cast<Square*>(s);
if(cp != 0)
cout << "It's a circle!" << endl;
if(sp != 0)
cout << "It's a square!" << endl;
Динамический состав:
Circle c;
Shape* s = &c; // Upcast: normal and OK
s = &c;
Circle* cp = 0;
Square* sp = 0;
cp = dynamic_cast<Circle*>(s);
if(cp != 0)
cout << "It's a circle!" << endl;
sp = dynamic_cast<Square*>(s);
if(sp != 0)
cout << "It's a square!" << endl;
Это быстрее, чтобы проверить тип, а затем сделать static_cast
, но операции не эквивалентны, так как это позволит только понизить до самого производного типа (любой промежуточный уровень не будет сопоставлен с typeid
). я хотел бы использовать dynamic_cast
так как он более устойчив (не сломается, если кто-то расширит ваш тип и передаст указатель, например).
Если производительность dynamic_cast
является проблемой в вашем приложении, вы должны пересмотреть дизайн. В то время как typeid
+ static_cast
быстрее чем dynamic_cast
Отсутствие необходимости включать тип объекта во время выполнения быстрее, чем у любого из них.
Эти примеры кода не являются логически одинаковыми. Вы забыли это dynamic_cast
учитывает наследование классов, а сравнение typeid () сравнивает только лист часть наследственного дерева. Единственное, что дает typeid — это «некоторый уникальный идентификатор, связанный с фактическим типом этого объекта». Только с помощью typeid () вы не можете проверить, возможно ли приведение к указателю общей базы, вы можете проверить только то, совпадает ли runtimetype-of-that с runtimetype-of-otherthing.
Сказав это, я думаю, что static_cast + typeid должен быть немного быстрее в общем смысле, но в некоторых случаях просто даст неправильные ответы.
Я думаю, что любой приличный компилятор сможет оптимизировать оба примера для одного и того же кода. Однако единственный способ выяснить это — измерить результаты для вашего конкретного набора инструментов.
Только один способ быть уверенным. Измерьте это с помощью std :: chrono и high_resolution_clock.