Увеличить время жизни локального объекта
От: sanx  
Дата: 27.07.11 06:03
Оценка:
При создании std::string внутри локальной области видимости какой-либо функции и добавлении в глобальный std::vector — строка сохраняется после выхода из функции. И при этом мы не делаем new. Как реализовать тоже самое для своего класса? Конечно же я хочу избавиться не сколько от new, сколько не заморачиваться с удалением, а, как я понимаю std::auto_ptr с контейнерами STL использовать нельзя. Да и вообще интересно как это реализовано в STL. Посмотреть сам могу, но ничего не могу понять
Re: Увеличить время жизни локального объекта
От: Ytz https://github.com/mtrempoltsev
Дата: 27.07.11 06:44
Оценка:
Здравствуйте, sanx, Вы писали:

S>При создании std::string внутри локальной области видимости какой-либо функции и добавлении в глобальный std::vector — строка сохраняется после выхода из функции.


Нет, она копируется. В вектор добавляется копия, оригинал при выходе из области видимости (в данном случае это границы функции) удаляется. Компиляторы могут делать оптимизацию в данном случае — не удалять оригинал и не делать копирования.

S>И при этом мы не делаем new. Как реализовать тоже самое для своего класса?


Сделать поддержку копирования.

S>Конечно же я хочу избавиться не сколько от new, сколько не заморачиваться с удалением, а, как я понимаю std::auto_ptr с контейнерами STL использовать нельзя.


Познакомься с boost, в частности с контейнерами владеющими объектами ptr_container (ptr_vector, ptr_set, ...) и умными указателями — shared_ptr и т.д.

S>Да и вообще интересно как это реализовано в STL. Посмотреть сам могу, но ничего не могу понять


Магии нет — передача по значению, а следовательно копирование.
Re: Увеличить время жизни локального объекта
От: PimpDaddy Россия  
Дата: 27.07.11 11:25
Оценка:
Здравствуйте, sanx, Вы писали:

S>При создании std::string внутри локальной области видимости какой-либо функции и добавлении в глобальный std::vector — строка сохраняется после выхода из функции. И при этом мы не делаем new. Как реализовать тоже самое для своего класса? Конечно же я хочу избавиться не сколько от new, сколько не заморачиваться с удалением, а, как я понимаю std::auto_ptr с контейнерами STL использовать нельзя. Да и вообще интересно как это реализовано в STL. Посмотреть сам могу, но ничего не могу понять


Если проблема в излишних копированиях\удалениях временных объектов, то можно предложить два решения
1) Иметь "легковесный" конструктор по умолчанию и реализовать операцию swap()
2) Использовать компилятор, поддерживающий rvalue references (http://thbecker.net/articles/rvalue_references/section_01.html), и реализовывать move-constructor и move-assignment.

В некоторых реализациях STL короткие строки использовали маленький внутренний буффер, а длинные — выделяли буффер в куче. Может поэтому в Вашем случае new не вызывается. Либо умный компилятор всё заинлайнил и соптимизировал...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.