crossplatform.ru

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

6 страниц V  « < 3 4 5 6 >  
Ответить в данную темуНачать новую тему
> вставка QVector в другой QVector
Авварон
  опции профиля:
сообщение 15.2.2013, 18:44
Сообщение #41


Студент
*

Группа: Участник
Сообщений: 99
Регистрация: 26.4.2009
Пользователь №: 709

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




Репутация:   0  


То есть тест вы так и не скачали и не посмотрели?:)
Да, какие еще ограничения добавите?:)

upd: прогнал и этот тест. Чуть лучше для std - std::vector и QVector равны по всем параметрам; QList чуть медленнее аппендит, гораздо быстрее препендит и рандомная вставка у Кулиста чуть лучше.

Не вижу, почему вы считаете использование QString'а в тесте "несостоятельным" - контейнеры, содержащие строки достаточно распространены, не использовать же на каждый чих контейнеры с указателями на строки?

Сообщение отредактировал Авварон - 15.2.2013, 19:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.2.2013, 19:07
Сообщение #42


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(Авварон @ 15.2.2013, 21:44) *
почему вы считаете использование QString'а в тесте "несостоятельным"

где я такое писал ?

а разница в том, что указатель - простой тип - будет копироваться в векторе тем самым memmove (сразу вся перемещаемая часть указателей то есть). А QString - оператором =.

И фиг с ним, с QString , я его всегда с удовольствием применяю даже в stl-контейнерах. Самое неприятное, когда элемент содержит указатели на динамические объекты - и возня с копированием ичень достаёт. Проще просто указатели в векторе/мапе и хранить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Авварон
  опции профиля:
сообщение 15.2.2013, 19:41
Сообщение #43


Студент
*

Группа: Участник
Сообщений: 99
Регистрация: 26.4.2009
Пользователь №: 709

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




Репутация:   0  


В том-то и вся фишка, что для QString не используется operator=, отсюда и разница в производительности в 10раз. Из-за шаред даты внутри QString QList/QVector используют memmove для ЛЮБЫХ типов Qt, основанных на COW (так как они являются перемещаемыми). Более того, вы можете применять эту оптимизацию это для своих типов при помощи макроса Q_DECLARE_TYPEINFO.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.2.2013, 20:33
Сообщение #44


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(Авварон @ 15.2.2013, 22:41) *
В том-то и вся фишка, что для QString не используется operator=, отсюда и разница в производительности в 10раз. Из-за шаред даты внутри QString QList/QVector используют memmove для ЛЮБЫХ типов Qt,

что за сказки :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Авварон
  опции профиля:
сообщение 16.2.2013, 0:03
Сообщение #45


Студент
*

Группа: Участник
Сообщений: 99
Регистрация: 26.4.2009
Пользователь №: 709

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




Репутация:   0  


Всё дело в том, что у QString'а в хедере есть следующий код:
Q_DECLARE_TYPEINFO(QString, Q_MOVABLE_TYPE);

благодаря которому QVector/QList "узнают" о том, что QString можно является movable и его можно перемещать меммувом.

На всякий случай приведу код, его должно быть достаточно для понимания, как оно работает:
Раскрывающийся текст
// qtypeinfo.h
#define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS) \
class QTypeInfo<TYPE > \
{ \
public: \
    enum { \
        isComplex = (((FLAGS) & Q_PRIMITIVE_TYPE) == 0), \
        isStatic = (((FLAGS) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), \
        isLarge = (sizeof(TYPE)>sizeof(void*)), \
        isPointer = false, \
        isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0), \
        sizeOf = sizeof(TYPE) \
    }; \
    static inline const char *name() { return #TYPE; } \
}

#define Q_DECLARE_TYPEINFO(TYPE, FLAGS) \
template<> \
Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS)

// qstring.h
class Q_CORE_EXPORT QString
{
...
    Data *d;
...
};
Q_DECLARE_TYPEINFO(QString, Q_MOVABLE_TYPE);

// qvector.h
template <typename T>
typename QVector<T>::iterator QVector<T>::erase(iterator abegin, iterator aend)
{
...
        if (QTypeInfo<T>::isStatic) {
...
        } else {
            destruct(abegin, aend);
            memmove(abegin, aend, (d->size - itemsToErase - itemsUntouched) * sizeof(T));
        }
...
}

Вы легко можете проверить сами, является ли тип статичным (то есть то, что он НЕ примитивен и НЕ мувабл):
    qDebug() << (bool)QTypeInfo<QString>::isStatic; // false
    qDebug() << (bool)QTypeInfo<QFileInfo>::isStatic; // false
    qDebug() << (bool)QTypeInfo<QFile>::isStatic; // true
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__ilya__
  опции профиля:
сообщение 16.2.2013, 12:37
Сообщение #46


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 19.1.2012
Пользователь №: 3143

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




Репутация:   0  


:o: :blink:
в общем два вектора соеденяются так:
QVector<T> v1, v2;
//..
v1 += v2;

Правильно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.2.2013, 16:33
Сообщение #47


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Авварон, ну QString, по сути, и есть один указатель, так что различия с вектором нет, если там применять указатели так же. В MFC раньше похоже был устроен CString , но потом его зашаблонили ))

__ilya__, так попробуй и всё, это же быстрее )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Авварон
  опции профиля:
сообщение 17.2.2013, 10:32
Сообщение #48


Студент
*

Группа: Участник
Сообщений: 99
Регистрация: 26.4.2009
Пользователь №: 709

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




Репутация:   0  


Цитата(Алексей1153 @ 16.2.2013, 17:33) *
Авварон, ну QString, по сути, и есть один указатель, так что различия с вектором нет, если там применять указатели так же.


Это правда, но различие в том, что в QVector есть эта оптимизация, а в std::vector нету. А писать std::vector<QString*> не очень удобно:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.2.2013, 12:30
Сообщение #49


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(Авварон @ 17.2.2013, 13:32) *
А писать std::vector<QString*> не очень удобно

я знаю про особенность QString, поэтому пишу

std::vector<QString>
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Авварон
  опции профиля:
сообщение 17.2.2013, 13:30
Сообщение #50


Студент
*

Группа: Участник
Сообщений: 99
Регистрация: 26.4.2009
Пользователь №: 709

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




Репутация:   0  


Цитата(Алексей1153 @ 17.2.2013, 13:30) *
Цитата(Авварон @ 17.2.2013, 13:32) *
А писать std::vector<QString*> не очень удобно

я знаю про особенность QString, поэтому пишу

std::vector<QString>


Вы-то знаете, а вот std::vestor - нет, и он будет использовать оператор= вместо меммува.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

6 страниц V  « < 3 4 5 6 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 1.12.2024, 21:14