Опять про нисходящее приведение, дизайн и т.п. |
Здравствуйте, гость ( Вход | Регистрация )
Опять про нисходящее приведение, дизайн и т.п. |
hoRUS |
16.8.2011, 15:16
Сообщение
#1
|
Студент Группа: Участник Сообщений: 30 Регистрация: 10.7.2008 Из: Москва Пользователь №: 231 Спасибо сказали: 5 раз(а) Репутация: 0 |
Никак не могу найти толкового ответа, что же лучше, "правильнее" (с архитектурной точки зрения), использовать для даункастинга в Qt-проектах - dynamic_cast или qobject_cast? В проекте, допустим, нет ограничений на использование RTTI, кастовать через границы динамических библиотек, допустим, не требуется, интересует прежде всего производительность на большинстве платформ (прежде всего Linux x86 + GCC) и архитектурная обоснованность (хотелось бы послушать опытных) того или иного подхода. Кастуются наследники QObject с макросом Q_OBJECT и интерфейсы, обработанные макросом Q_DECLARE_INTERFACE().
Или лучше вообще избегать динамического даункастинга и обходиться виртуальными функциями? Например, в базовом классе определять enum с константами, присвоенными разным типам наследников и виртуальной ф-цией возвращать тип и, осонвываясь на этом типе, статик-кастом делать приведение? Это сильное издевательство над ООП? dynamic_cast "внутри" работает не похожим способом? Слышал, что он может быть реализован не на vtable, а на сравнении строк strcmp() - это звучит страшно. |
|
|
Litkevich Yuriy |
18.8.2011, 8:18
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
hoRUS |
18.8.2011, 15:43
Сообщение
#3
|
Студент Группа: Участник Сообщений: 30 Регистрация: 10.7.2008 Из: Москва Пользователь №: 231 Спасибо сказали: 5 раз(а) Репутация: 0 |
Я имел в виду нисходящее приведение типов - от предка к потомкам при наследовании (извиняюсь ).
Попробовал написать тестик, может кого-то заинтересует (поправьте, если некорректен)
Сборка - релиз, GCC 4.5.2 + Qt 4.7.3, Ubuntu 11.04 ( 2.6.38-10 ), оптимизации - по умолчанию. Вывод в среднем выглядит примерно так у меня: dynamic_cast: 372 msecs qobject_cast: 141 msecs При увеличении количества итераций в 10 раз: dynamic_cast: 3461 msecs qobject_cast: 1622 msecs Видимо, если уж делать нисходящее приведение, то лучше по при возможности использовать qobject_cast() |
|
|
Текстовая версия | Сейчас: 28.11.2024, 20:46 |