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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QVector. Правильное управление памятью  (Прочитано 3220 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Декабрь 12, 2014, 09:30 »

Привет друзья!
Заинтересовал вопрос.
Имеется:
Код
C++ (Qt)
QVector<int> dest;
{
   QVector<int> tmp;
   tmp.reserve(100500);
   tmp << 1 << 2 << 3;
   dest = tmp;
}
На каком этапе правильнее сделать sqeeze?
Что происходит с памятью, когда мы делаем sqeeze? Полагаю, выделяется новый участок памяти, данные копируются в него и старый участок затирается.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Декабрь 12, 2014, 10:44 »

На каком этапе правильнее сделать sqeeze?
Что происходит с памятью, когда мы делаем sqeeze? Полагаю, выделяется новый участок памяти, данные копируются в него и старый участок затирается.
Необязательно, адрес может остаться тем же (но полагаться на это не стоит). На "достаточно старых ОС" sqeeze может не освобождать память. Создание tmp здесь ничего не дает - просто будет swap "пимплов", dest будет иметь тот же неиспользуемый пул. Резервирование "побольше" проблематично. Думается меньше ухищрений = лучше
Код
C++ (Qt)
QVector<int> dest;
dest << 1 << 2 << 3;
dest.squeeze();
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Декабрь 12, 2014, 11:52 »

Давайте ещё усложним
Код
C++ (Qt)
QVector<int> dest;
{
   QVector<int> tmp;
   tmp.reserve(100500);
   tmp << 1 << 2 << 3;
   dest = tmp;
   tmp << 4;
}
На строчке tmp << 4; мы получаем два массива с capacity 100500. Я правильно понимаю, что в ней выделяется память под второй массив и копируется содержимое, после чего добавляется 4?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 12, 2014, 12:06 »

Давайте ещё усложним
Код
C++ (Qt)
QVector<int> dest;
{
   QVector<int> tmp;
   tmp.reserve(100500);
   tmp << 1 << 2 << 3;
   dest = tmp;
   tmp << 4;
}
На строчке tmp << 4; мы получаем два массива с capacity 100500. Я правильно понимаю, что в ней выделяется память под второй массив и копируется содержимое, после чего добавляется 4?
Да, срабатывает имплисит шара. Пул QVector тоже копируется. Если Вам не требуется чтобы эл-ты сидели в памяти непрерывно, то лучше использовать др контейнер
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Декабрь 12, 2014, 17:00 »

Если Вам не требуется чтобы эл-ты сидели в памяти непрерывно, то лучше использовать др контейнер
Мне нужно иметь плотное расположение.

Кстати, а добавление в конец (без предварительной резервации памяти) и считывание по порядку у вектора, ведь, быстрее, чем у кого-либо?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 12, 2014, 17:52 »

Мне нужно иметь плотное расположение.

Кстати, а добавление в конец (без предварительной резервации памяти) и считывание по порядку у вектора, ведь, быстрее, чем у кого-либо?
Обращение по индексу - да, у вектора самое быстрое. А вот добавление в конец - вовсе нет. Поэтому для серьезных объемов есть смысл добавить сначала все в др контейнер, а когда все готово - перебросить в выходной вектор.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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