Внезапно...
От: 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 — всё равно память не освободится.
Re[3]: Внезапно...
От: Vain Россия google.ru
Дата: 14.11.11 17:11
Оценка: :)
Здравствуйте, Erop, Вы писали:

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

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

E>А почему это гарантирует освобождение буфера?..
Ну тогда ничто не гарантирует
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: Как освободить буффер std::vector'а?
От: Erop Россия  
Дата: 14.11.11 17:14
Оценка: 28 (4) +1
Здравствуйте, LaptevVV, Вы писали:

LVV>Достали!


Блин! Ну когда же народ научится темы-то внятно называть?
Вот уж достали, так достали...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Внезапно...
От: uzhas Ниоткуда  
Дата: 14.11.11 17:24
Оценка: +1
Здравствуйте, Vain, Вы писали:

V>Ну тогда ничто не гарантирует

смысл в том, что при данном подходе идет копирование элементов из правого вектора в левый. при этом в левом векторе переаллокации будут происходить, если изначально там меньше места, чем в правом векторе
то есть если правый вектор пустой (в нашем случае), то в левом векторе память не освободиться: просто выставится size=0, т.к в правом векторе элементов 0 штук
поэтому обычно рекомендуют делать swap с только что созданным вектором. при создании обычно не выделяют много памяти и swap меняет не только элементы, но и выделенные буфера (при этом capacity тоже меняются по стандарту), все этим "триком" пользуются (я бы назвал это костылем)
в C++11 сделали красивый метод для этого
Re[2]: Внезапно...
От: Abyx Россия  
Дата: 14.11.11 17:32
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Почему я обозвал трюк со swap() трюком.

LVV>Мне кажется, что логичнее просто сделать специальный метод.

ну и где вы были когда делали стандарт?
In Zen We Trust
Re: Внезапно...
От: minorlogic Украина  
Дата: 14.11.11 17:58
Оценка: 1 (1) +1
Здравствуйте, LaptevVV, Вы писали:

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


Только уничтожить объект вектор, явным образом.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Внезапно...
От: LaptevVV Россия  
Дата: 14.11.11 18:46
Оценка:
Здравствуйте, Abyx, Вы писали:

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


LVV>>Почему я обозвал трюк со swap() трюком.

LVV>>Мне кажется, что логичнее просто сделать специальный метод.

A>ну и где вы были когда делали стандарт?

В Астрахани... Да там и без меня осознали. Тут упомянули об одном методе в стандарте С++11
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Как освободить буффер std::vector'а?
От: rg45 СССР  
Дата: 14.11.11 20:37
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Блин! Ну когда же народ научится темы-то внятно называть?

E>Вот уж достали, так достали...

Егор, ну что за проза: "как освободить буфер...", то ли дело: "Внезапно...", "Закономерно...", "Навеяло...", "Вечерело...", "Ломало...", "Колбасило..." — романтика!
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Как освободить буффер std::vector'а?
От: о_О
Дата: 14.11.11 20:43
Оценка: :))
Здравствуйте, Erop, Вы писали:

E>Вот уж достали, так достали...


каждый раз, когда я вижу от тебя мне кажется, что я разговариваю с ботом...
Re[5]: Как освободить буффер std::vector'а?
От: Erop Россия  
Дата: 14.11.11 20:47
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>

Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: сектор зохвачен
От: о_О
Дата: 14.11.11 20:50
Оценка: :)
Здравствуйте, Erop, Вы писали:

Re[7]: В честь чего гуляем?
От: Erop Россия  
Дата: 14.11.11 20:56
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>


Не сопьёшься?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Внезапно...
От: Vain Россия google.ru
Дата: 15.11.11 08:45
Оценка:
Здравствуйте, 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.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: Внезапно...
От: gegMOPO4  
Дата: 15.11.11 08:59
Оценка: +1
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, uzhas, Вы писали:
V>>>Ну тогда ничто не гарантирует
U>>смысл в том, что при данном подходе идет копирование элементов из правого вектора в левый. при этом в левом векторе переаллокации будут происходить, если изначально там меньше места, чем в правом векторе
U>>то есть если правый вектор пустой (в нашем случае), то в левом векторе память не освободиться: просто выставится size=0, т.к в правом векторе элементов 0 штук
U>>поэтому обычно рекомендуют делать swap с только что созданным вектором. при создании обычно не выделяют много памяти и swap меняет не только элементы, но и выделенные буфера (при этом capacity тоже меняются по стандарту), все этим "триком" пользуются (я бы назвал это костылем)
V>Ну это implementation defined

Отнюдь. vector<>::swap обязан обмениваться буферами. 23.1.1.11

— no swap() function invalidates any references, pointers, or iterators referring to the elements of the
containers being swapped.

Re[7]: Внезапно...
От: Vain Россия google.ru
Дата: 15.11.11 22:36
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

V>>Ну это implementation defined

MOP>Отнюдь. vector<>::swap обязан обмениваться буферами. 23.1.1.11
MOP>

MOP>— no swap() function invalidates any references, pointers, or iterators referring to the elements of the
MOP>containers being swapped.

А кто гарантирует что конструктор по умолчанию будет создавать объект с пустым буфером?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[8]: Внезапно...
От: Erop Россия  
Дата: 15.11.11 23:57
Оценка:
Здравствуйте, Vain, Вы писали:

V>А кто гарантирует что конструктор по умолчанию будет создавать объект с пустым буфером?

Никто, но при этом откат к состоянию, как после конструктора -- это впоне так себе цель...

Может же так оказаться, что короткий буфер в теле объекта сидит, например...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Внезапно...
От: Vain Россия google.ru
Дата: 16.11.11 00:25
Оценка:
Здравствуйте, Erop, Вы писали:

V>>А кто гарантирует что конструктор по умолчанию будет создавать объект с пустым буфером?

E>Никто, но при этом откат к состоянию, как после конструктора -- это впоне так себе цель...
E>Может же так оказаться, что короткий буфер в теле объекта сидит, например...
Ну так из-за степеней свободы присущей C++ — гарантий нет.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: Внезапно...
От: Erop Россия  
Дата: 16.11.11 00:39
Оценка:
Здравствуйте, Vain, Вы писали:

E>>Никто, но при этом откат к состоянию, как после конструктора -- это впоне так себе цель...

E>>Может же так оказаться, что короткий буфер в теле объекта сидит, например...
V>Ну так из-за степеней свободы присущей C++ — гарантий нет.

Это завист от того, гарантии чего тебе нужны...

Обычно освободить критично именно большой буфер, так что сброс к состоянию, как после конструктора, может быть вполне остаточным.
Ну и потом, обычно таки вектор стремятся сделать эффективным, а аллокация -- дорогая операция, так что странно алокировать буфер на куче "про запас". А если не на куче и недорого, то и не жалко, как бы...
Всё равно, если вектор так спроектирован, что совсем без буфера не бывает, то и сбрасывать до нуля его не надо значит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.