Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!
clear() и resize() работают с элементами вектора, а не с памятью.
reserve() не уменьшает уже задействованный объем.
Неужели только трюк со swap() ???
Или лезть непосредственно в методы аллокатора? Не хотелось бы...
Кто-нить с подобным сталкивался?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Неужели только трюк со swap() ???
Трюк со swap хотя бы дожен работать. Остальные трюки от реализации зависят...
А вообще, зачем тебе освобождать буфер? Разрушай сам вектор!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, LaptevVV, Вы писали:
LVV>>Неужели только трюк со swap() ??? E>Трюк со swap хотя бы дожен работать. Остальные трюки от реализации зависят...
Ну, я в студии проверил — работает. E>А вообще, зачем тебе освобождать буфер? Разрушай сам вектор!
Мне нельзя...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
E>>Трюк со swap хотя бы дожен работать. Остальные трюки от реализации зависят... LVV>Ну, я в студии проверил — работает.
Что пробовал? swap с пцстм ветором? Это, как раз, должно работать...
E>>А вообще, зачем тебе освобождать буфер? Разрушай сам вектор! LVV>Мне нельзя...
Что значит "нельзя"?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, LaptevVV, Вы писали:
LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать! LVV>clear() и resize() работают с элементами вектора, а не с памятью.
насколько я знаю, решение что делать с буфером лежит на реализации, и у dinkumware буфер остается ради оптимизации.
LVV>Неужели только трюк со swap() ???
чем плох swap() и временный объект? ничего криминального не вижу
Здравствуйте, 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.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, 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, то может там и появилось что-то что вам поможет.
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, LaptevVV, Вы писали:
LVV>>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать! LVV>>clear() и resize() работают с элементами вектора, а не с памятью. LVV>>reserve() не уменьшает уже задействованный объем. LVV>>Неужели только трюк со swap() ??? V>Зачем так сложно, чем это хуже? V>
V>vec = std::vector<xxx>();
V>
Попробую.
Интересно посмотреть, насколько по-разному будет в Студии и минГВ.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать! LVV>clear() и resize() работают с элементами вектора, а не с памятью. LVV>reserve() не уменьшает уже задействованный объем. LVV>Неужели только трюк со swap() ??? LVV>Или лезть непосредственно в методы аллокатора? Не хотелось бы... LVV>Кто-нить с подобным сталкивался?
Кончай плакать. Это стандартная идиома в одну строчку. (которую ты не знаешь, а еще С++ преподаешь!)
Здравствуйте, uncommon, Вы писали:
U>Здравствуйте, LaptevVV, Вы писали:
LVV>>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать! LVV>>clear() и resize() работают с элементами вектора, а не с памятью. LVV>>reserve() не уменьшает уже задействованный объем. LVV>>Неужели только трюк со swap() ??? LVV>>Или лезть непосредственно в методы аллокатора? Не хотелось бы... LVV>>Кто-нить с подобным сталкивался?
U>Кончай плакать. Это стандартная идиома в одну строчку. (которую ты не знаешь, а еще С++ преподаешь!) U>
U>vector<int>().swap(my_vec_object);
U>
Блин, ну как только аноним, так непременно обвинитель...
Достали!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Почему я обозвал трюк со swap() трюком.
Мне кажется, что логичнее просто сделать специальный метод.
Аналогично тому, что operator[] не проверяет индекс, а at() — проверяет.
Пусть бы clear() — не освобождает память, а что-то вроде allclear() — память освобождает.
Раз уж reserve() работает только в одну сторону.
При использовании swap() возникает лишняя сущность — временный объект...
С точки зрения практики — это пофиг, но идеологически корябает...
Я, естественно, "поеду", на шашечки смотреть не буду...
Я и до исходного поста попробовал.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, LaptevVV, Вы писали:
LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать! LVV>clear() и resize() работают с элементами вектора, а не с памятью. LVV>reserve() не уменьшает уже задействованный объем. LVV>Неужели только трюк со swap() ??? LVV>Или лезть непосредственно в методы аллокатора? Не хотелось бы... LVV>Кто-нить с подобным сталкивался?
В С++11 для шаблонов basic_string, deque и vector есть функция shrink_to_fit()
Здравствуйте, LaptevVV, Вы писали: LVV>Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!
shrink_to_fit() в C++11. Если же это недоступно, то swap() с пустым вектором — стандартный общеизвестный способ.
Здравствуйте, johny5, Вы писали: J>Мне понравилось там, J>
It depends on the implementation if the request is fulfilled.
Это объяснимо. Некоторые имплементации string первые 16 символов хранят в самом объекте, а не в динамическом буфере. Ужимать capacity меньше 16 нет смысла. А если менеджер памяти выделяет память блоками, кратными 16 байт, то нет смысла ужимать с 64 до 50 — всё равно память не освободится.