** kea |
Отправлено: 03.10.2005, 10:32 |
|
Не зарегистрирован
|
Здравствуйте! Привожу код:
vector bv;
int s0 = bv.size();
int c0 = bv.capacity();
bv.resize(500);
int s100 = bv.size();
int c100 = bv.capacity();
bv.resize(38);
bv.reserve(38);
int s38 = bv.size();
int c38 = bv.capacity();
Здесь
s0 = 0, c0 = 0
s500 = 500, c0 = 512
s38 = 38, c38 = 512
т.е. при уменьшении размера вектора не происходит высвобождение лишней памяти?
Когда происходит высвобождение памяти у контейнера vector?
Использовался STL и Builder 6.
|
|
Asher |
Отправлено: 03.10.2005, 10:58 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
QUOTE | при уменьшении размера вектора не происходит высвобождение лишней памяти? |
.capacity() показывает сколько ЕЩЁ элементов можно разместить без расширения контейнера. Если size и capacity возвращают одинаковое значение, значит свободного места не осталось и следующая вставка приведет к выделению памяти.
Если размер устанавливаемый через reserve меньше текущего vector вообще ничего не делает.
Для усечения размера vectora обычно применяют трюк с перестановкой.
Например:
CODE | vector<int> vct_;
vector<int>(vct_).swap(vct_);
|
Но, в общем случае, значения допустимых размеров могут быть кратны каким либо значениям, например степеням двойки, и capacity покажет ближайший больший размер.
|
|
** kea |
Отправлено: 03.10.2005, 16:07 |
|
Не зарегистрирован
|
Здравствуйте!
Если не применять трюк с перестановкой, который вы привели, то все же происходит потеря памяти? |
|
Asher |
Отправлено: 03.10.2005, 16:36 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Смотря что считать потерей.
Утечки нет, но зарезервированная память операционной системе при resize не возвращается.
P.S. прелесть stl в том, что она идет в исходниках. Смотрите и вникайте.
Отредактировано Asher — 03/10/2005, 17:38
|
|
** kea |
Отправлено: 04.10.2005, 15:30 |
|
Не зарегистрирован
|
Здравствуйте!
vector(vct_).swap(vct_); — сколько это будет стоить по времени?
|
|
Gedeon |
Отправлено: 04.10.2005, 15:45 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Зависит от кол-ва элементов в контейнере и типа самих элементов.
|
|
Gedeon |
Отправлено: 04.10.2005, 15:59 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Вот тут заглянул в Джосьютиса, так там написано что
эта ф-ция переставляет внутренние указатели со ссылками на данные, так что если контейнеры одного типа, то от типа самих элементов похоже время не зависит.
|
|
Asher |
Отправлено: 04.10.2005, 16:22 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
Тут все не так просто.
Выражение vector(vct_).swap(vct_); создает временный вектор, содержащий копию vct_, а затем содержимое вектора vct_ меняется с временным вектором функцией swap. После этого старый "раздутый" вектор, который теперь временный, уничтожается.
Основная работа выполняется копирующим конструктором.
Соотвественно все временные затраты — там.
При этом он выделяет ровно столько памяти, сколько необходимо для хранения vct_ (ну с учетом размера блока памяти используемого в данной версии stl по умолчанию и Вы не применяли собственный аллокатор)
Отредактировано Asher — 04/10/2005, 17:22
|
|
** kea |
Отправлено: 07.10.2005, 13:33 |
|
Не зарегистрирован
|
Здравствуйте!
А оператор .clear() приводит к освобождению памяти, например, в деструкторе объекта использующего контейнер vector? |
|
Asher |
Отправлено: 07.10.2005, 15:24 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
Если я правильно понял вопрос, то...
clear() приводит к осовбождению памяти занятой контейнером, но если контейнер содержит не объекты а указатели на них, то сами объекты не удаляются.
P.S. может быть купите или скачаете себе "Стандартная библиотека С++" Джосьютиса ?
Сразу отпадет множество вопросов.
|
|
** kea |
Отправлено: 12.10.2005, 17:37 |
|
Не зарегистрирован
|
Здравствуйте!
Если выложите ссылочку на такую книгу "Стандартная библиотека С++", то с удовольствием скачаю.
К тому же рад общению со знающими людьми.
|
|
Asher |
Отправлено: 13.10.2005, 07:52 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
Здесь лежит электронная версия книги Джосьютиса
|
|