Понадобилось мне возвратить распределенную для вектора память явным образом. И оказалось, что не так просто это сделать!
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 — всё равно память не освободится.
Блин! Ну когда же народ научится темы-то внятно называть?
Вот уж достали, так достали...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Vain, Вы писали:
V>Ну тогда ничто не гарантирует
смысл в том, что при данном подходе идет копирование элементов из правого вектора в левый. при этом в левом векторе переаллокации будут происходить, если изначально там меньше места, чем в правом векторе
то есть если правый вектор пустой (в нашем случае), то в левом векторе память не освободиться: просто выставится size=0, т.к в правом векторе элементов 0 штук
поэтому обычно рекомендуют делать swap с только что созданным вектором. при создании обычно не выделяют много памяти и swap меняет не только элементы, но и выделенные буфера (при этом capacity тоже меняются по стандарту), все этим "триком" пользуются (я бы назвал это костылем)
в C++11 сделали красивый метод для этого
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, LaptevVV, Вы писали:
LVV>>Почему я обозвал трюк со swap() трюком. LVV>>Мне кажется, что логичнее просто сделать специальный метод.
A>ну и где вы были когда делали стандарт?
В Астрахани... Да там и без меня осознали. Тут упомянули об одном методе в стандарте С++11
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Erop, Вы писали:
E>Блин! Ну когда же народ научится темы-то внятно называть? E>Вот уж достали, так достали...
Егор, ну что за проза: "как освободить буфер...", то ли дело: "Внезапно...", "Закономерно...", "Навеяло...", "Вечерело...", "Ломало...", "Колбасило..." — романтика!
--
Не можешь достичь желаемого — пожелай достигнутого.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, uzhas, Вы писали:
V>>Ну тогда ничто не гарантирует U>смысл в том, что при данном подходе идет копирование элементов из правого вектора в левый. при этом в левом векторе переаллокации будут происходить, если изначально там меньше места, чем в правом векторе U>то есть если правый вектор пустой (в нашем случае), то в левом векторе память не освободиться: просто выставится size=0, т.к в правом векторе элементов 0 штук U>поэтому обычно рекомендуют делать swap с только что созданным вектором. при создании обычно не выделяют много памяти и swap меняет не только элементы, но и выделенные буфера (при этом capacity тоже меняются по стандарту), все этим "триком" пользуются (я бы назвал это костылем)
Ну это implementation defined
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали: V>Здравствуйте, uzhas, Вы писали: V>>>Ну тогда ничто не гарантирует U>>смысл в том, что при данном подходе идет копирование элементов из правого вектора в левый. при этом в левом векторе переаллокации будут происходить, если изначально там меньше места, чем в правом векторе U>>то есть если правый вектор пустой (в нашем случае), то в левом векторе память не освободиться: просто выставится size=0, т.к в правом векторе элементов 0 штук U>>поэтому обычно рекомендуют делать swap с только что созданным вектором. при создании обычно не выделяют много памяти и swap меняет не только элементы, но и выделенные буфера (при этом capacity тоже меняются по стандарту), все этим "триком" пользуются (я бы назвал это костылем) V>Ну это implementation defined
Здравствуйте, Vain, Вы писали:
V>А кто гарантирует что конструктор по умолчанию будет создавать объект с пустым буфером?
Никто, но при этом откат к состоянию, как после конструктора -- это впоне так себе цель...
Может же так оказаться, что короткий буфер в теле объекта сидит, например...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
V>>А кто гарантирует что конструктор по умолчанию будет создавать объект с пустым буфером? E>Никто, но при этом откат к состоянию, как после конструктора -- это впоне так себе цель... E>Может же так оказаться, что короткий буфер в теле объекта сидит, например...
Ну так из-за степеней свободы присущей C++ — гарантий нет.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
E>>Никто, но при этом откат к состоянию, как после конструктора -- это впоне так себе цель... E>>Может же так оказаться, что короткий буфер в теле объекта сидит, например... V>Ну так из-за степеней свободы присущей C++ — гарантий нет.
Это завист от того, гарантии чего тебе нужны...
Обычно освободить критично именно большой буфер, так что сброс к состоянию, как после конструктора, может быть вполне остаточным.
Ну и потом, обычно таки вектор стремятся сделать эффективным, а аллокация -- дорогая операция, так что странно алокировать буфер на куче "про запас". А если не на куче и недорого, то и не жалко, как бы...
Всё равно, если вектор так спроектирован, что совсем без буфера не бывает, то и сбрасывать до нуля его не надо значит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском