static_cast и RTTI против dynamic_cast

Пожалуйста, соблюдайте приведенный ниже код. Насколько я знаю, 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;

2

Решение

Это быстрее, чтобы проверить тип, а затем сделать static_cast, но операции не эквивалентны, так как это позволит только понизить до самого производного типа (любой промежуточный уровень не будет сопоставлен с typeid). я хотел бы использовать dynamic_cast так как он более устойчив (не сломается, если кто-то расширит ваш тип и передаст указатель, например).

Если производительность dynamic_cast является проблемой в вашем приложении, вы должны пересмотреть дизайн. В то время как typeid + static_cast быстрее чем dynamic_castОтсутствие необходимости включать тип объекта во время выполнения быстрее, чем у любого из них.

7

Другие решения

Эти примеры кода не являются логически одинаковыми. Вы забыли это dynamic_cast учитывает наследование классов, а сравнение typeid () сравнивает только лист часть наследственного дерева. Единственное, что дает typeid — это «некоторый уникальный идентификатор, связанный с фактическим типом этого объекта». Только с помощью typeid () вы не можете проверить, возможно ли приведение к указателю общей базы, вы можете проверить только то, совпадает ли runtimetype-of-that с runtimetype-of-otherthing.

Сказав это, я думаю, что static_cast + typeid должен быть немного быстрее в общем смысле, но в некоторых случаях просто даст неправильные ответы.

3

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

1

Только один способ быть уверенным. Измерьте это с помощью std :: chrono и high_resolution_clock.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector