Внезапно...
От: LaptevVV Россия  
Дата: 13.11.11 19:50
Оценка: -3
Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!
clear() и resize() работают с элементами вектора, а не с памятью.
reserve() не уменьшает уже задействованный объем.
Неужели только трюк со swap() ???
Или лезть непосредственно в методы аллокатора? Не хотелось бы...
Кто-нить с подобным сталкивался?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Внезапно...
От: Erop Россия  
Дата: 13.11.11 20:12
Оценка: +1 -1
Здравствуйте, LaptevVV, Вы писали:

LVV>Неужели только трюк со swap() ???

Трюк со swap хотя бы дожен работать. Остальные трюки от реализации зависят...

А вообще, зачем тебе освобождать буфер? Разрушай сам вектор!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Внезапно...
От: LaptevVV Россия  
Дата: 13.11.11 20:24
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, LaptevVV, Вы писали:


LVV>>Неужели только трюк со swap() ???

E>Трюк со swap хотя бы дожен работать. Остальные трюки от реализации зависят...
Ну, я в студии проверил — работает.
E>А вообще, зачем тебе освобождать буфер? Разрушай сам вектор!
Мне нельзя...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Внезапно...
От: Erop Россия  
Дата: 13.11.11 21:29
Оценка:
Здравствуйте, LaptevVV, Вы писали:

E>>Трюк со swap хотя бы дожен работать. Остальные трюки от реализации зависят...

LVV>Ну, я в студии проверил — работает.
Что пробовал? swap с пцстм ветором? Это, как раз, должно работать...

E>>А вообще, зачем тебе освобождать буфер? Разрушай сам вектор!

LVV>Мне нельзя...

Что значит "нельзя"?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Внезапно...
От: о_О
Дата: 13.11.11 21:55
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!

LVV>clear() и resize() работают с элементами вектора, а не с памятью.
насколько я знаю, решение что делать с буфером лежит на реализации, и у dinkumware буфер остается ради оптимизации.

LVV>Неужели только трюк со swap() ???

чем плох swap() и временный объект? ничего криминального не вижу
Re: Внезапно...
От: о_О
Дата: 13.11.11 22:14
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Неужели только трюк со swap() ???

да и, почему "трюк"?

template <typename T> void clear_and_free(std::vector<T>& v)
{
  std::vector<T> empty;

  v.clear();
  v.swap(empty);
}
Re: Внезапно...
От: Vain Россия google.ru
Дата: 13.11.11 22:20
Оценка: 1 (1) -1
Здравствуйте, LaptevVV, Вы писали:

LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!

LVV>clear() и resize() работают с элементами вектора, а не с памятью.
LVV>reserve() не уменьшает уже задействованный объем.
LVV>Неужели только трюк со swap() ???
Зачем так сложно, чем это хуже?
vec = std::vector<xxx>();
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Внезапно...
От: Abyx Россия  
Дата: 13.11.11 23:36
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!

LVV>clear() и resize() работают с элементами вектора, а не с памятью.
LVV>reserve() не уменьшает уже задействованный объем.
LVV>Неужели только трюк со swap() ???
LVV>Или лезть непосредственно в методы аллокатора? Не хотелось бы...
LVV>Кто-нить с подобным сталкивался?

я с этим сталкивался когда читал "C++ Coding Standards: 101 Rules, Guidelines, and Best Practices" by Herb Sutter and Andrei Alexandrescu
если вы юзаете С++98, то с тех пор С++98 не менялся.
если вы юзаете С++11, то может там и появилось что-то что вам поможет.
In Zen We Trust
Re[2]: Внезапно...
От: johny5 Новая Зеландия
Дата: 14.11.11 03:46
Оценка: 1 (1) +2
V>Зачем так сложно, чем это хуже?
V>
V>vec = std::vector<xxx>();
V>


Это эквивалентно clear(); (для MSVC).
Re[2]: Внезапно...
От: LaptevVV Россия  
Дата: 14.11.11 04:04
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, LaptevVV, Вы писали:


LVV>>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!

LVV>>clear() и resize() работают с элементами вектора, а не с памятью.
LVV>>reserve() не уменьшает уже задействованный объем.
LVV>>Неужели только трюк со swap() ???
V>Зачем так сложно, чем это хуже?
V>
V>vec = std::vector<xxx>();
V>

Попробую.
Интересно посмотреть, насколько по-разному будет в Студии и минГВ.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Внезапно...
От: uncommon Ниоткуда  
Дата: 14.11.11 05:14
Оценка: 1 (1) +1
Здравствуйте, LaptevVV, Вы писали:

LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!

LVV>clear() и resize() работают с элементами вектора, а не с памятью.
LVV>reserve() не уменьшает уже задействованный объем.
LVV>Неужели только трюк со swap() ???
LVV>Или лезть непосредственно в методы аллокатора? Не хотелось бы...
LVV>Кто-нить с подобным сталкивался?

Кончай плакать. Это стандартная идиома в одну строчку. (которую ты не знаешь, а еще С++ преподаешь!)
vector<int>().swap(my_vec_object);
Re[2]: Внезапно...
От: LaptevVV Россия  
Дата: 14.11.11 05:35
Оценка: -1
Здравствуйте, uncommon, Вы писали:

U>Здравствуйте, LaptevVV, Вы писали:


LVV>>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!

LVV>>clear() и resize() работают с элементами вектора, а не с памятью.
LVV>>reserve() не уменьшает уже задействованный объем.
LVV>>Неужели только трюк со swap() ???
LVV>>Или лезть непосредственно в методы аллокатора? Не хотелось бы...
LVV>>Кто-нить с подобным сталкивался?

U>Кончай плакать. Это стандартная идиома в одну строчку. (которую ты не знаешь, а еще С++ преподаешь!)

U>
U>vector<int>().swap(my_vec_object);
U>

Блин, ну как только аноним, так непременно обвинитель...
Достали!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Внезапно...
От: LaptevVV Россия  
Дата: 14.11.11 06:05
Оценка: 1 (1)
Почему я обозвал трюк со swap() трюком.
Мне кажется, что логичнее просто сделать специальный метод.
Аналогично тому, что operator[] не проверяет индекс, а at() — проверяет.
Пусть бы clear() — не освобождает память, а что-то вроде allclear() — память освобождает.
Раз уж reserve() работает только в одну сторону.
При использовании swap() возникает лишняя сущность — временный объект...
С точки зрения практики — это пофиг, но идеологически корябает...
Я, естественно, "поеду", на шашечки смотреть не буду...
Я и до исходного поста попробовал.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Внезапно...
От: Erop Россия  
Дата: 14.11.11 07:32
Оценка:
Здравствуйте, Vain, Вы писали:


V>Зачем так сложно, чем это хуже?

V>
V>vec = std::vector<xxx>();
V>


А почему это гарантирует освобождение буфера?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Внезапно...
От: avp_  
Дата: 14.11.11 08:57
Оценка: -2 :))) :)
Наиболее читабельный способ, это явно вызвать деструктор, а потом сразу
placement new.
Posted via RSDN NNTP Server 2.1 beta
Re: Внезапно...
От: PM  
Дата: 14.11.11 08:59
Оценка: 15 (4)
Здравствуйте, LaptevVV, Вы писали:

LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!

LVV>clear() и resize() работают с элементами вектора, а не с памятью.
LVV>reserve() не уменьшает уже задействованный объем.
LVV>Неужели только трюк со swap() ???
LVV>Или лезть непосредственно в методы аллокатора? Не хотелось бы...
LVV>Кто-нить с подобным сталкивался?

В С++11 для шаблонов basic_string, deque и vector есть функция shrink_to_fit()
Re: Внезапно...
От: gegMOPO4  
Дата: 14.11.11 12:38
Оценка: 2 (2) +1
Здравствуйте, LaptevVV, Вы писали:
LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!

shrink_to_fit() в C++11. Если же это недоступно, то swap() с пустым вектором — стандартный общеизвестный способ.
Re[2]: Внезапно...
От: gegMOPO4  
Дата: 14.11.11 12:40
Оценка: +1
Здравствуйте, Vain, Вы писали:
V>Зачем так сложно, чем это хуже?
V>
V>vec = std::vector<xxx>();
V>


Тем, что не работает.
Re[2]: Внезапно...
От: johny5 Новая Зеландия
Дата: 14.11.11 15:02
Оценка:
Здравствуйте, PM, Вы писали:

PM>В С++11 для шаблонов basic_string, deque и vector есть функция shrink_to_fit()


Мне понравилось там,

It depends on the implementation if the request is fulfilled.

Re[3]: Внезапно...
От: gegMOPO4  
Дата: 14.11.11 15:31
Оценка: 1 (1) +1
Здравствуйте, johny5, Вы писали:
J>Мне понравилось там,
J>

It depends on the implementation if the request is fulfilled.


Это объяснимо. Некоторые имплементации string первые 16 символов хранят в самом объекте, а не в динамическом буфере. Ужимать capacity меньше 16 нет смысла. А если менеджер памяти выделяет память блоками, кратными 16 байт, то нет смысла ужимать с 64 до 50 — всё равно память не освободится.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.