Russian Qt Forum

Qt => Общие вопросы => Тема начата: __Heaven__ от Декабрь 12, 2014, 09:30



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


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


Название: Re: QVector. Правильное управление памятью
Отправлено: __Heaven__ от Декабрь 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?


Название: Re: QVector. Правильное управление памятью
Отправлено: Igors от Декабрь 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 тоже копируется. Если Вам не требуется чтобы эл-ты сидели в памяти непрерывно, то лучше использовать др контейнер


Название: Re: QVector. Правильное управление памятью
Отправлено: __Heaven__ от Декабрь 12, 2014, 17:00
Если Вам не требуется чтобы эл-ты сидели в памяти непрерывно, то лучше использовать др контейнер
Мне нужно иметь плотное расположение.

Кстати, а добавление в конец (без предварительной резервации памяти) и считывание по порядку у вектора, ведь, быстрее, чем у кого-либо?


Название: Re: QVector. Правильное управление памятью
Отправлено: Igors от Декабрь 12, 2014, 17:52
Мне нужно иметь плотное расположение.

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