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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: QList и QVector  (Прочитано 38024 раз)
Alex_cs_gsp
Гость
« Ответ #15 : Август 24, 2010, 20:04 »

1.
Записан
Sancho_s_rancho
Гость
« Ответ #16 : Август 24, 2010, 20:05 »

2 Alex_cs_gsp
Этот перец может делать как считает нужным. Истина одна - это библия стандарт ISO C++.
Записан
BRE
Гость
« Ответ #17 : Август 24, 2010, 20:05 »

А так?  Подмигивающий

Код
C++ (Qt)
int main(int argc, char *argv[])
{
 
   QApplication app(argc, argv);
 
   QLabel lbl;
   lbl.setNum((int)sizeof( QString ));
   lbl.show();
 
  return app.exec();
}
 
Записан
Alex_cs_gsp
Гость
« Ответ #18 : Август 24, 2010, 20:08 »

4
Ну и как так?  ???Объект меньше весит?
Записан
BRE
Гость
« Ответ #19 : Август 24, 2010, 20:10 »

4
Ну и как так? Объект меньше весит?
Что как так?
Указатель на твоей платформе занимает 4 байта, а не один.
Записан
Alex_cs_gsp
Гость
« Ответ #20 : Август 24, 2010, 20:11 »

А, ну-да я неправильно сайзоф использовал, бывает. Просто день независимости отмечал.
http://msdn.microsoft.com/en-us/library/4s7x1k91(VS.71).aspx Для объекта возвращает 1 как и написано.

Вот некогда проверять. Остальные Qt объекты также содержат по указателю, а все данные-члены по нему находятся???
« Последнее редактирование: Август 24, 2010, 20:19 от Alex_cs_gsp » Записан
BRE
Гость
« Ответ #21 : Август 24, 2010, 20:42 »

Для объекта возвращает 1 как и написано.
Для какого объекта и где написано?
Такая запись вообще не корректна:
Код
C++ (Qt)
sizeof( QString() )
 
и поэтому компилятор выдает предупреждение.
Записан
Alex_cs_gsp
Гость
« Ответ #22 : Август 24, 2010, 21:05 »

Я ж говорю неправильно, а написано у меня выше в посту.  Улыбающийся
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


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

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

   По большому счету, вектор и список отличаются только тем, что у вектора элементы располагаются в памяти последовательно друг за другом (в виде линейного массива), а у списка - где угодно, и лишь указатели на элементы представляют собой линейный массив.
Так и есть, но это совсем не так просто как кажется  Улыбающийся  Напр. добавление в конец для QList намного быстрее. Для QList можно спокойно брать адрес элемента т.к. он не изменится даже при вставках/удалениях. А для вектора нет. QList лихо добавляет в начало, для вектора это тяжелая операция. С др. стороны нет способа уменьшить размер массива указателей в QList и это может быть проблемой. Ну и как ни крути QList расходует памяти больше. И не только на указатель. Наверное Вам не составит труда пояснить на что же еще?  Улыбающийся
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


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

Напр. добавление в конец для QList намного быстрее.
  Это намеки на перераспределение памяти при ее заполнении для вектора? Есть такая тема. Но для нашего случая (известного количества измерений) есть операция резервирования. Кстати, для списка, кажется, нет такой? Т.е. массив указателей перераспределяется по алгоритму, заложенному разработчиком класса?
Для QList можно спокойно брать адрес элемента т.к. он не изменится даже при вставках/удалениях. А для вектора нет.
   Добавить в список элемент и где-то хранить его адрес? Сомнительное преимущество. Хотя имеет место быть.
QList лихо добавляет в начало, для вектора это тяжелая операция.
   Поясните, за счет чего. И не путаете ли Вы простой список со связным списком?
Ну и как ни крути QList расходует памяти больше. И не только на указатель. Наверное Вам не составит труда пояснить на что же еще?  Улыбающийся
  По той информации, которой я располагаю, не могу. Может, все же раскроете секрет?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

QList лихо добавляет в начало, для вектора это тяжелая операция.
   Поясните, за счет чего. И не путаете ли Вы простой список со связным списком?
Не путаю - см. исходник QList (напр метод prepend)

Ну и как ни крути QList расходует памяти больше. И не только на указатель. Наверное Вам не составит труда пояснить на что же еще?  Улыбающийся
  По той информации, которой я располагаю, не могу. Может, все же раскроете секрет?
Я могу подсказать: здесь изучение исходников никак не поможет, там только + 4 байта. Но все же это не так, больше памяти расходуется, иногда намного больше (почти вдвое). Думайте, причина очень простая, Вы ее давно знаете  Улыбающийся
Записан
Alex_cs_gsp
Гость
« Ответ #27 : Август 25, 2010, 15:15 »

Цитировать
Я могу подсказать: здесь изучение исходников никак не поможет, там только + 4 байта. Но все же это не так, больше памяти расходуется, иногда намного больше (почти вдвое). Думайте, причина очень простая, Вы ее давно знаете  Улыбающийся

Подсказка супер - исключаем действие не смотреть исходники. Зачем в школу играться, и так времени мало Грустный Если можешь скажи, всем интересно.
« Последнее редактирование: Август 25, 2010, 15:17 от Alex_cs_gsp » Записан
foufou
Гость
« Ответ #28 : Август 27, 2010, 19:25 »

Большое спасибо общественности за обсуждение моего вопроса ! На днях определюсь со структурой своих данных. Почитаю еще только... Улыбающийся
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #29 : Август 27, 2010, 21:00 »

Почитаю еще только... Улыбающийся
Посмотрите еще книги:
  Николай Джосьютис. C++ Стандартная библиотека. Для профессионалов.
  Бьерн Страуструп. Язык программирования C++. Специальное издание.
Думаю, это будет полезнее, чем ковыряться в исходниках даже такой хорошей штуки, как Qt. Средства стандартной библиотеки эффективнее любых других по определению...
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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