Положительный/Отрицательный опыт использования STL

User avatar
StressedintheUS
Уже с Приветом
Posts: 664
Joined: 11 Nov 2002 04:29
Location: USA

Положительный/Отрицательный опыт использования STL

Post by StressedintheUS »

Пытаюсь применить STL библиотеки в С++ для автоматизации работы с памятью (чтобы объекты выгружались из памяти автоматом). Пока - страшный геморрой, особенно с массивами объектов, синтакс неприятный, решения отнюдь не тривиальные.

Интересует опыт подобных решений - удалось ли применить STL в больших проектах без особой натуги, переключились ли на собственные классы - менеджеры памяти - или использовали что-либо другое?
Palych
Уже с Приветом
Posts: 13683
Joined: 16 Jan 2001 10:01

Post by Palych »

Можно добавить чайниковский вопрос? (начальство заставляет на C++ писать :( )
Где можно почитать про управлению памятью в больших проектах?
Наши аксакалы отрицают необходимость централизованного memory management mechanism :pain1:
User avatar
lx_uk
Уже с Приветом
Posts: 376
Joined: 04 Feb 2002 10:01

Re: Положительный/Отрицательный опыт использования STL

Post by lx_uk »

StressedintheUS wrote:Пытаюсь применить STL библиотеки в С++ для автоматизации работы с памятью (чтобы объекты выгружались из памяти автоматом). Пока - страшный геморрой, особенно с массивами объектов, синтакс неприятный, решения отнюдь не тривиальные.


Это дело привычки/опыта скорее.

StressedintheUS wrote:Интересует опыт подобных решений - удалось ли применить STL в больших проектах без особой натуги, переключились ли на собственные классы - менеджеры памяти - или использовали что-либо другое?


Использование STL контейнеров обычно дает неплохой результат в плане упорядочивания кода. Впрочем обычно всё контейнерами и ограничивается. Ну плюc еще string, auto_ptr. А вот управление памятью, алгоритмы и всякие другие сложности как правило (IMHO) остаются невостребованными. Используется то что есть по-умолчанию.
User avatar
AndreyT
Уже с Приветом
Posts: 3000
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: Положительный/Отрицательный опыт использования STL

Post by AndreyT »

StressedintheUS wrote:Пытаюсь применить STL библиотеки в С++ для автоматизации работы с памятью (чтобы объекты выгружались из памяти автоматом). Пока - страшный геморрой, особенно с массивами объектов, синтакс неприятный, решения отнюдь не тривиальные.


В STL нет специализированных средств, предназначенных для решения таких задач. Поэтому мне не совсем понятно, в чем суть вопроса. Кстати, что имеется в виду, под "выгружением из памяти"?

Интересует опыт подобных решений - удалось ли применить STL в больших проектах без особой натуги, переключились ли на собственные классы - менеджеры памяти - или использовали что-либо другое?
Best regards,
Андрей
Вася Пупкин
Ник закрыт.
Posts: 86
Joined: 04 Feb 2004 06:14

Re: Положительный/Отрицательный опыт использования STL

Post by Вася Пупкин »

AndreyT wrote:Кстати, что имеется в виду, под "выгружением из памяти"?


Сборщика мусора как в жабе человек хочет
User avatar
AndreyT
Уже с Приветом
Posts: 3000
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: Положительный/Отрицательный опыт использования STL

Post by AndreyT »

Вася Пупкин wrote:
AndreyT wrote:Кстати, что имеется в виду, под "выгружением из памяти"?


Сборщика мусора как в жабе человек хочет


В том то и дело, что первое, что приходит в голову, когда говорят о "выгружении из памяти" - это своппинг, а не сборка мусора. Хотя и сборка мусора тоже кандидат. Потому и непонятно.
Best regards,
Андрей
Вася Пупкин
Ник закрыт.
Posts: 86
Joined: 04 Feb 2004 06:14

Re: Положительный/Отрицательный опыт использования STL

Post by Вася Пупкин »

AndreyT wrote:
Вася Пупкин wrote:
AndreyT wrote:Кстати, что имеется в виду, под "выгружением из памяти"?


Сборщика мусора как в жабе человек хочет


В том то и дело, что первое, что приходит в голову, когда говорят о "выгружении из памяти" - это своппинг, а не сборка мусора. Хотя и сборка мусора тоже кандидат. Потому и непонятно.


Своппингом обычно ОС занимается.
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Re: Положительный/Отрицательный опыт использования STL

Post by Vovka »

StressedintheUS wrote:Пытаюсь применить STL библиотеки в С++ для автоматизации работы с памятью (чтобы объекты выгружались из памяти автоматом). Пока - страшный геморрой, особенно с массивами объектов, синтакс неприятный, решения отнюдь не тривиальные.

А в чём конкретно проблема? Я вот если честно даже представить не могу, где там "страшный геморрой" может возникнуть при работе с памятью.
Единственно, вам ещё для нормального использования скорее всего понадобятся смарт-поинтеры кроме auto_ptr (его ни в коем случае нельзя хранить в коллекциях!). Например, посмотрите сюда: http://boost.org/libs/smart_ptr/smart_ptr.htm. В коллекции обычно хорошо запихивать shared_ptr из этой библиотеки.

Один совет по поводу STL и её изучения.
Эта библиотека не сложная, она просто неочевидная. Т.е., есть какие-нить библиотеки - вроде коллекций в MFC - посмотрел на нитерфейс класса, вроде как ясно, что он делает. Худо-будно начал использовать.
Другое дело STL. Лучше сначала выделить какое-то время на то, чтобы почитать про неё. Немного, не больше одного или даже половины дня. В онлайне вроде где-то есть статья самого Степанова. Если книжка - то есть книжка "The C++ Standard Library", by Nicolai M. Josuttis. Но её даже всю читать не надо, она толстая. MSDN насчёт STL лучше не смотреть, там написано очень плохо, лучше вот это: http://www.sgi.com/tech/stl/table_of_contents.html. Там, правда, несколько нестандартных расширений описано, но есть соотв. пометки. Ну и неплохо почитать Meyers, "Effective STL".

StressedintheUS wrote: Интересует опыт подобных решений - удалось ли применить STL в больших проектах без особой натуги, переключились ли на собственные классы - менеджеры памяти - или использовали что-либо другое?

Удавалось и удаётся. И в больших, и в маленьких тоже.
Мне вот наоборот, после STL любая библиотека контейнеров неуклюжей кажется.
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Re: Положительный/Отрицательный опыт использования STL

Post by Vovka »

Вася Пупкин wrote:
AndreyT wrote:Кстати, что имеется в виду, под "выгружением из памяти"?

Сборщика мусора как в жабе человек хочет


Кстати, зачем? Т.е. это не риторический вопрос, действительно интересно.
В жабе как я понимаю детерминированных деструкторов нету, соответственно и смартпоинтеров. Поэтому им пришлось исхитряться и изобретать GC. А в каких случаях он для C++ нужен, я пока не могу представить.
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Re: Положительный/Отрицательный опыт использования STL

Post by A. Fig Lee »

Vovka wrote:
Вася Пупкин wrote:
AndreyT wrote:Кстати, что имеется в виду, под "выгружением из памяти"?

Сборщика мусора как в жабе человек хочет


Кстати, зачем? Т.е. это не риторический вопрос, действительно интересно.
В жабе как я понимаю детерминированных деструкторов нету, соответственно и смартпоинтеров. Поэтому им пришлось исхитряться и изобретать GC. А в каких случаях он для C++ нужен, я пока не могу представить.


Ну если хочется реиспользовать обьекты - какой смысл их создавать и уничтожать?
Можно иметь пул обьектов с автосайзом и удалять в конце.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
AndreyT
Уже с Приветом
Posts: 3000
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: Положительный/Отрицательный опыт использования STL

Post by AndreyT »

Вася Пупкин wrote:
AndreyT wrote:
Вася Пупкин wrote:
AndreyT wrote:Кстати, что имеется в виду, под "выгружением из памяти"?


Сборщика мусора как в жабе человек хочет


В том то и дело, что первое, что приходит в голову, когда говорят о "выгружении из памяти" - это своппинг, а не сборка мусора. Хотя и сборка мусора тоже кандидат. Потому и непонятно.


Своппингом обычно ОС занимается.


Обычно - ОС. Необычно - не ОС. Кто ж знает, что человеку нужно.

Своппинг в Win32, например, никак не помогает в ситуациях, когда задаче недостаточно адресного простанства процесса. Т.е. мало 2Гб и все тут. В такой ситуации спасает только самописный своппинг.
Best regards,
Андрей
potapych
Уже с Приветом
Posts: 1360
Joined: 02 Mar 2002 10:01

Re: Положительный/Отрицательный опыт использования STL

Post by potapych »

AndreyT wrote:Своппинг в Win32, например, никак не помогает в ситуациях, когда задаче недостаточно адресного простанства процесса. Т.е. мало 2Гб и все тут. В такой ситуации спасает только самописный своппинг.

( стало интересно ) А что за задачи такие, где 2ГБ памяти может не хватить?
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Или AWE. Или переход на 64bit.
А базам данных памяти всегда мало
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Re: Положительный/Отрицательный опыт использования STL

Post by Vovka »

A. Fig Lee wrote: Ну если хочется реиспользовать обьекты - какой смысл их создавать и уничтожать?
Можно иметь пул обьектов с автосайзом и удалять в конце.

Ну а при чём тут GC? Сами явно программируйте время жизни, и всё тут.
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Re: Положительный/Отрицательный опыт использования STL

Post by A. Fig Lee »

Vovka wrote:
A. Fig Lee wrote: Ну если хочется реиспользовать обьекты - какой смысл их создавать и уничтожать?
Можно иметь пул обьектов с автосайзом и удалять в конце.

Ну а при чём тут GC? Сами явно программируйте время жизни, и всё тут.

1. Как программировать время хизни?
2. А какая разница с GC?
3. Дык вроде вопрос был зачем кастом менеджмент меморы, предположили - нужен гарбейдж коллектор. Зачем он должен быть точной копией жавовского?
Верить нельзя никому - даже себе. Мне - можно!
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Vovka,
кроме того, иногда хочется ветвистые обьекты одним куском аллокировать - чтоб потом пхнуть их другой программе через шеред мемори или еще как.
Аллокировать например сразу на шеред меморы..
You know...
Верить нельзя никому - даже себе. Мне - можно!
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Re: Положительный/Отрицательный опыт использования STL

Post by Vovka »

A. Fig Lee wrote:1. Как программировать время хизни?
2. А какая разница с GC?

Да как угодно программировать - как хочется. Напрямую программировать - уничтожать, когда надо уничтожать.
Разница в том, что о состоянии каждого объекта в любой момент времени можно со 100% вероятностью сказать - жив он или мёртв. И ниакаого дурацкого реиспользования. Либо жив, либо мёртв.
Пока что так и не понял, зачем GC - жабовский, нежабовский - в любом виде.
A. Fig Lee wrote:кроме того, иногда хочется ветвистые обьекты одним куском аллокировать - чтоб потом пхнуть их другой программе через шеред мемори или еще как.
Аллокировать например сразу на шеред меморы..

Ну, написать кастомную сереализацию - десеарелизацию. Да даже в MFC это было, миллион лет назад. Опять не понятно, при чём тут GC.
A. Fig Lee wrote:You know...

No, still don't...
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Re: Положительный/Отрицательный опыт использования STL

Post by A. Fig Lee »

Vovka wrote:Да как угодно программировать - как хочется. Напрямую программировать - уничтожать, когда надо уничтожать.
Разница в том, что о состоянии каждого объекта в любой момент времени можно со 100% вероятностью сказать - жив он или мёртв. И ниакаого дурацкого реиспользования. Либо жив, либо мёртв.
Пока что так и не понял, зачем GC - жабовский, нежабовский - в любом виде.

Да я не утверждаю что ето 100% GC. Ну как Вы будете знать что обьект уже был использован и освободился? Надо иметь глобальный обьект, который имел бы референс к етим обьектам, знал бы их состояние и выделял уже освободившиеся.
Как без глобального обьекта? Точка входа какайто должна быть в любом случае.
Расскажите как Вы узнаете где ети выделеные обьекты и каково их состояние?
Ну, написать кастомную сереализацию - десеарелизацию. Да даже в MFC это было, миллион лет назад. Опять не понятно, при чём тут GC.


1. Да дался Вам етот GC. ИМХО, человек высказал предположение о GC. Вопрос то был о мемори менеджмент? Или я чегото не понимаю?
Сериализацию - не еффективно - только создали обьект и сериализировать его?
Смысл? Почему сразу не аллокировать в одном флаконе?
Верить нельзя никому - даже себе. Мне - можно!
Palych
Уже с Приветом
Posts: 13683
Joined: 16 Jan 2001 10:01

Re: Положительный/Отрицательный опыт использования STL

Post by Palych »

Vovka wrote:Разница в том, что о состоянии каждого объекта в любой момент времени можно со 100% вероятностью сказать - жив он или мёртв. И никаого дурацкого реиспользования. Либо жив, либо мёртв.
Пока что так и не понял, зачем GC - жабовский, нежабовский - в любом виде.

Если делать етот мечанисм стандартным - каждый конструктор и каждый деструктор будет содержать синхронизированный код, что может замедлить систему. Отсюда появляется соблазн отложить удаление... в итоге получается ме... то есть GC...
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Re: Положительный/Отрицательный опыт использования STL

Post by Strannik223 »

StressedintheUS wrote:Пытаюсь применить STL библиотеки в С++ для автоматизации работы с памятью (чтобы объекты выгружались из памяти автоматом). Пока - страшный геморрой,


Ну если STL пихать куда оно не предназначено природой, тогда дейтствительно, геморрой можно заработать :mrgreen:
Никакой разрухи нет. (с) Проф. Преображенский.
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Re: Положительный/Отрицательный опыт использования STL

Post by Vovka »

Palych wrote:Если делать етот мечанисм стандартным - каждый конструктор и каждый деструктор будет содержать синхронизированный код, что может замедлить систему. Отсюда появляется соблазн отложить удаление... в итоге получается ме... то есть GC...

Какой такой "синхронизированный код". Вообще не понял, о чём вы. Пожете поконкретнее, с примером? Если ктор-дторы такие дорогие, то зачем их вообще часто вызывать, тогда нужно объект постоянно в памяти держать.
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

Интересно, хоть кто то первоначальный постинг прочитал?
Человек STL пользоватся не умеет, а вы начали про GC, сериалиалазацию с синхронизацией и еще черт знает что.
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Post by roadman »

Strannik223 wrote:Интересно, хоть кто то первоначальный постинг прочитал?
Человек STL пользоватся не умеет, а вы начали про GC, сериалиалазацию с синхронизацией и еще черт знает что.

I worked and still working with STL. The final result, the main containers I overrided (map, vector, list, stack, hash), but algorithms are all STL original. And the main purpose to do this - memory management. When I don't need a super performance I simply use original STL containers.
Disadvantages of STL containers are:
1. STL makes a copy of provided allocator (I would like to send only reference).
Solution: create wrapper around your allocator, which keeps only reference on your class and let STL to make a copy of your object :D - it's only copy of reference.
2. Some internal objects of containers (map, list - MS implementation) are created on provided allocator and will be alive until destruction of object, even if container is empty, so you can't clear container and reset allocator at the same time.
Solution: rewrite container or override specific methods.
3. Some objects (allocated on reisable memory) are simple (no additional dynamic memory allocated on heap) and can be safely destroyed without calling destructor.
However the implementation of clear function will waste of a lot time to go through a huge set of objects.
Solution - overide container for a simple objects or only clear method.
The improvments I made is not STL lack (nobody can write a 100% perfect code for ALL purposes). It was just a business requirement.
The philosophy of one century is the common sense of the next. --Henry Ward Beecher
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

roadman wrote:2. Some internal objects of containers (map, list - MS implementation) are created on provided allocator and will be alive until destruction of object, even if container is empty, so you can't clear container and reset allocator at the same time.


А что про StlPort можете сказать, я когда несколько раз натыкался на грабли в МС реализации, и каждый раз StlPort работал как положено.
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Post by roadman »

Strannik223 wrote:А что про StlPort можете сказать, я когда несколько раз натыкался на грабли в МС реализации, и каждый раз StlPort работал как положено.

Стыдно признаться :oops: , но я не смотрел реализацию STLPort, мне было легче переписать контейнеры самому, чем интегрировать в С++ third party STL код для программ, написанных под Microsoft. Более того, мне нужен был контейнер который бы в методе clear - ничего почти не делал, в случае создания объектов на внешнем allocator.
Типа

template < class T, class A = byte_allocator >
class _list : public base_list< T >
{
public:
....................
inline _list< T, A >::iterator insert(A& allocator_, _list< T, A >::iterator it, const T& x = T());
..............................
// no memory deallocation
// remove the specified element of list
// must be defined compare operator for stored object
inline void remove(const T& x);
................................
inline void clear() {_head._prev = _head._next = head(); }
};

Должен сказать, что это не есть правильный подход в общем случае :umnik1: и начинающим программистам следует использовать и переиспользовать хорошо написанный, как ими самими, так и другими разработчиками код, попутно разбираясь и учась.
The philosophy of one century is the common sense of the next. --Henry Ward Beecher

Return to “Вопросы и новости IT”