Re: По мотивам RTTI
От: Павел Кузнецов  
Дата: 25.03.02 12:50
Оценка: 4 (1)
M>что быстрее: switch (p->GetType()) или последовательный if (MessageClick* p2 = dynamic_cast<MessageClick*>(p)){} else if...
M>Кто-нибудь знает насколько быстро работает dynamic_cast по сравнению с вызовом виртуальной функции?

Вообще, это некорректный вопрос. Для разных компиляторов значения будут разными. В принципе, можно ожидать, что switch будет быстрее. Например, для MSVC++7.0, если вызов функции принять за единицу, числа примерно такие:

virtual function call: 1.37487
dynamic_cast<Derived*>(base): 13.2874
dynamic_cast<MultipleDerived*>(base1): 15.1835
dynamic_cast<MultipleDerived*>(base2): 22.739
dynamic_cast<VirtualDerived*>(vbase): 13.2515
dynamic_cast<MultipleVirtualDerived*>(vbase): 35.6703

Однако, следует заметить, что, за редким исключением, вместо поиска лучшего typeid следует пересмотреть дизайн приложения. Для большинства реальных приложений скорость выполнения инструкции dynamic_cast вполне адекватна. Кроме того, "самопальные" решения для RTTI в большинстве случаев не могут учесть многих тонкостей и, как следствие, обычно ведут к снижению надежности и/или ухудшению общего дизайна приложения.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.