crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Опять про нисходящее приведение, дизайн и т.п.
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 @ 16.8.2011, 18:16) *
использовать для даункастинга
переведи на русский
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
hoRUS
  опции профиля:
сообщение 18.8.2011, 15:43
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 10.7.2008
Из: Москва
Пользователь №: 231

Спасибо сказали: 5 раз(а)




Репутация:   0  


Я имел в виду нисходящее приведение типов - от предка к потомкам при наследовании (извиняюсь :) ).
Попробовал написать тестик, может кого-то заинтересует (поправьте, если некорректен)

class Base : public QObject
{
    Q_OBJECT

public:
    Base(QObject *parent = NULL) : QObject(parent) {}
    virtual ~Base() {}
};

class Inherited : public Base
{
    Q_OBJECT

    int ii;
public:
    Inherited(QObject *parent = NULL) : Base(parent) {}
    virtual ~Inherited() {}

    void f() {ii = 10;}
};

//..........................................
#define ITER_COUNT 10000000

    Inherited i1, i2;
    Base *pBI1 = &i1;
    Base *pBI2 = &i2;

    QTime startTime = QTime::currentTime();
    for(int i = 0; i < ITER_COUNT; ++i)
    {
        Inherited *pII = dynamic_cast<Inherited*>(i % 2 ? pBI1 : pBI2); //чтобы избежать здесь оптимизаций
        pII -> f();                                                     //чтобы избежать здесь оптимизаций
    }
    int msecsCount = startTime.msecsTo(QTime::currentTime());
    std::cout << "dynamic_cast: " << msecsCount << " msecs" << std::endl;

    startTime = QTime::currentTime();
    for(int i = 0; i < ITER_COUNT; ++i)
    {
        Inherited *pII = qobject_cast<Inherited*>(i % 2 ? pBI1 : pBI2);
        pII -> f();
    }
    msecsCount = startTime.msecsTo(QTime::currentTime());
    std::cout << "qobject_cast:  " << msecsCount << " msecs" << std::endl;

//..........................................


Сборка - релиз, 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()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 20:37