Russian Qt Forum
Ноябрь 27, 2024, 08:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: QList и QVector  (Прочитано 37968 раз)
foufou
Гость
« : Август 24, 2010, 00:18 »

Пишу программку для хитроумных расчетов над большими массивами данных (показания приборов, считанные за большой интервал времени). Т.е., одна-несколько колонок и до десятков или даже сотен тысяч строк. Хотел бы спросить совета у более опытных людей: как лучше организовать такие данные ? Колеблюсь между списком колонок в виде списка векторов типа QVector и списком списков типа QList.
В литературе пишут, что QVector экономней расходует память, но тормозно работает с операциями типа добавления и вставки новых элементов, в особенности, когда вектор уже состоит из большого количества элементов.
Про QList пишут, что операции вставки/добавления выполняются быстро, но QList якобы кушает гораздо больше памяти.
Также хотел бы спросить: может вообще для хранения и работы с огромными массивами чисел с плавающей точкой используется какая-нибудь совсем другая организация данных и какие-то специфические приемы ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Август 24, 2010, 01:45 »

Пишут вообще-то правильно, но все же лучше смотреть в исходники. Напр

но QList якобы кушает гораздо больше памяти.
QList съедает на 4 байта больше - для каждого элемента (или 8 в 64-бит), т.е. размер адреса
Поэтому выбор между QList и QVector определяется размером элемента. Если элемент QString, то QList подойдет лучше

.Т.е., одна-несколько колонок и до десятков или даже сотен тысяч строк
...
может вообще для хранения и работы с огромными массивами чисел с плавающей точкой..
По нынешним временам размер "сотни миллионов элементов"  не считается "огромным", а о "сотнях тысяч" уже давно забыли. Прикиньте размер. Если в рамках 1 Gb, то беспокоиться нечего
Записан
foufou
Гость
« Ответ #2 : Август 24, 2010, 03:05 »

Спасибо за ответ !
Применю QList. Скорость в моем случае важнее, чем плюс 4 байта к каждому элементу.
Записан
Alex_cs_gsp
Гость
« Ответ #3 : Август 24, 2010, 06:39 »

   Не знаю как в твоем случае, может оно тебе и не нужно, но если например, используются таблицы как эксель, то в таком случае применяется действительно другой прием. Дело в том, что даже если ячейка ничего не хранит, под неё все-равно нужно отвести память необходимую для размещения указателя. Если взять пустую таблицу эксель, то получается внушительный объем памяти. Поэтому применяют хеширование, чтобы память выделялась под ячейки, которые содержат данные. Если в твоем случае это не требуется (последовательное заполнение ячеек), то можно обойтись списком или вектором.

Может и не совсем верно, но вектор можно представить как обертку над обычным массивом, содержащий объекты, а список как обертку над массивом указателей на эти объекты. И теперь можно представить, как в каждом случае происходит вставка/удаление элемента и перераспределение памяти.
« Последнее редактирование: Август 24, 2010, 06:52 от Alex_cs_gsp » Записан
Alex_cs_gsp
Гость
« Ответ #4 : Август 24, 2010, 06:47 »

Цитировать
Поэтому выбор между QList и QVector определяется размером элемента. Если элемент QString, то QList подойдет лучше

А откуда известен размер  QString? Уверен, что если рассматривать этот класс как POD и применить sizeof(QString), то получится очень даже не большой размер, т.к. скорее-всего это обертка над с-строкой (указатель + возможно инт под размер).
« Последнее редактирование: Август 24, 2010, 17:14 от Alex_cs_gsp » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Август 24, 2010, 08:38 »

это не обертка над си строкой, строка там юникодовская (массив шортов - кучаров). Кроме того применяется механизм дата-шаринга. Но в целом, данных там не так много
Записан
Sancho_s_rancho
Гость
« Ответ #6 : Август 24, 2010, 08:40 »

Цитировать
Поэтому выбор между QList и QVector определяется размером элемента. Если элемент QString, то QList подойдет лучше

А откуда известен размер  QString? Уверен, что если рассматривать этот класс как POD и применить sizeof(QString), то получится очень даже не большой размер, т.к. скорее-всего это обертка над с-строкой (указатель + возможно размер).

А я почему-то уверен, что sizeof(QString) вернет размер указателя. Там вся петрушка в куче лежит.
Записан
merke
Гость
« Ответ #7 : Август 24, 2010, 08:42 »

Что такое POD?
Записан
Sancho_s_rancho
Гость
« Ответ #8 : Август 24, 2010, 08:45 »

Что такое POD?
американская рок-группа из города Сан-Диего, Калифорния.  Смеющийся
Ну или для тех кто немного занимается программированием http://forum.sources.ru/index.php?showtopic=150319
Записан
Alex_cs_gsp
Гость
« Ответ #9 : Август 24, 2010, 16:58 »

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

А теперь хочу для себя уяснить  - массив шортов или все-таки утф-8, у последнего вроде языковой диапазон
шире?

Что такое POD?
американская рок-группа из города Сан-Диего, Калифорния.  Смеющийся
Ну или для тех кто немного занимается программированием http://forum.sources.ru/index.php?showtopic=150319

    Кстати, не первый раз вижу этот пост, и не все совсем так. Например, в книге Рихтера Windows via C++ от 2009г., указанный товарищ приводит кучу примеров, в которых он пишет классы, которые являются потомками POD структур, причем активно использует конструкторы и методы (хоть не виртуальные). Далее в такую "расширенную структуру" сохраняет что хочет и передает ее адрес обычной вынь-апи ф-ии, которая рассматривает ее как базовый класс (т.е. как базовую POD структуру). С точки зрения С++ и той статьи, такое делать вроде бы нельзя. Пытался уяснить на мсдн форуме, никто ничего толкового не ответил. Книга под грифом микрософт пресс. Хотя наследование можно было заменить вложением и вопросы бы не возникали  как там компилятор по стандарту должен разместить в памяти объект.
« Последнее редактирование: Август 24, 2010, 17:24 от Alex_cs_gsp » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Август 24, 2010, 17:42 »

Цитировать
Поэтому выбор между QList и QVector определяется размером элемента. Если элемент QString, то QList подойдет лучше

А откуда известен размер  QString? Уверен, что если рассматривать этот класс как POD и применить sizeof(QString), то получится очень даже не большой размер, т.к. скорее-всего это обертка над с-строкой (указатель + возможно инт под размер).

Ладно, давайте подробно. sizeof(QString) = 4 (32 бит). Для таких размеров (<= sizeof(void *)) QList оптимизирован: данные хранятся как массив указателей, вызов new не происходит. Это занимает столько же памяти что и QVector, но операции вставки/удаления намного быстрее, т.к можно обойтись memmove вместо конструкторов копирования.

Ну и конечно никакая QString не обертка над с-строкой Улыбающийся
Записан
Alex_cs_gsp
Гость
« Ответ #11 : Август 24, 2010, 19:51 »

Ну да 1 байт. Внутри класса QString определена структура struct Data, в которой определены все необходимые члены, а в самом классе QString имеется лишь указатель на эту структуру, ну а размер указателя уже платформой определяется. Таким образом вопрос, о том что размер QString большой не стоит, что я с самого начало говорил. А вообще шаблончик нужно взять на заметку - можно любые объекты делать размером в 1 байт (для стека).
Записан
BRE
Гость
« Ответ #12 : Август 24, 2010, 19:59 »

Ну да 1 байт.
...можно любые объекты делать размером в 1 байт (для стека).
Почему один байт?
Не один байт.  Улыбающийся
Записан
Alex_cs_gsp
Гость
« Ответ #13 : Август 24, 2010, 20:02 »

Ну да 1 байт.
...можно любые объекты делать размером в 1 байт (для стека).
Почему один байт?
Не один байт.  Улыбающийся

Сам удивляюсь.
Код:
int main(int argc, char *argv[])
{

    QApplication app(argc, argv);

    QLabel lbl;
    lbl.setNum((int)sizeof(QString()));
    lbl.show();

   return app.exec();
}


Да, и виртуальных методов я не увидел.
« Последнее редактирование: Август 24, 2010, 20:04 от Alex_cs_gsp » Записан
BRE
Гость
« Ответ #14 : Август 24, 2010, 20:03 »

И чего пишет?
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.065 секунд. Запросов: 22.