![]() |
|
Модераторы: bsa |
![]()
|
|
| BadPointer |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 7.9.2009 Репутация: нет Всего: нет |
Добрый вечер!
При проектировании свяки классов, возник вот такой вопрос по динамическому выделению памяти объектам класса: Допустим, у нас есть схема: класс DocumentManager, который создается в динамической памяти при запуске приложения: DocumentManager * pDocMan = new DocumentManager(). В распоряжении его находятится список объектов класса Document.Допустим, они хранятся в списке: std::list<Document*>, под который мы также выделяем динамическую память: std::list<Document*> = new std::list<Document*>(). Класс Document - объект этого класса может хранить большое количество данных, в данном случае, напрмер, карта, хранящая несколько тысяч именованнных структур: std::map<CString, TSomeStruct>. Вопросы: 1. Если объект класса DocumentManager создается при запуске программы в динамической памяти, значит ли что нет смысла создавать список std::list<Document*> в динамической памяти. Т.е при создании объекта все его данные будут размещены в куче? Но что будет, если список std::list<Document*> создать в динамической памяти в конструкторе объекта DocumentManager? Они уже не будут входить в область данных, занимаемой объектом класса DocumentManager? 2. Если объект класса Document будет хранить в себе многие тысячи строк в карте std::map<CString,TSomeStruct>, имеет ли смысл размещать переменную типа: std::map<CString,TSomeStruct> m_SturctMap в динамической памяти, или достаточно разместить объект класса Document в динамической памяти, а досуп к списку оставить по значению? Может ли есть какие-то правила, в зависимости от которых объект класса или отдельные поля класса должны размещаться в динамической памяти? Как кто определяет, эту переменную я сделаю указателем на выделенную область памяти, а доступ к этой будет по значению? В каких случаях объект класса нужно создавать в динамической памяти? 3. Дело ли в размере переменной, которая хранит данные класса - на основе только ли размера принимается решении о выделении памяти в куче? Буду благодарен за ответы! |
|||
|
||||
| tzirechnoy |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: -1 Всего: 16 |
Нет, не значит. Объекты создаются в динамической памяти тогда, когда их либо невозможно либо неэффективно создавать в виде полей или переменных ужэ существующих сущеностей. Невозможно обычно из-за неизвестного количества объектов либо из-за требований полиморфизма (нельзя просто так взять и присвоить значение класса-потомка классу-предку, а вот ссылку или указатель типа класс-потомок присвоить ссылке или указателю на класс-предок -- можно), неэффективно -- из-за ожыдаемого времени жызни объекта, несовпадающего с временем жызни сущностей в которых они порождаются. Соответственно, вопрос, выделять ли для std::list<Document *> память динамически -- ортогонален вопросу, выделена ли динамически память для DocumentManager. Анализировать надо сравнительное время существования этих двух переменных и возможность обойтись ограниченным количеством std::list (впрочем, учитывая, что std::list -- контэйнер, им как раз часто одним обходятся дажэ для очень сложных случаев).
См.вышэ, это вообще безразлично. Вопрос только -- сможэшь ли ты так сделать или нет. Да, замечу, что контэйнеры std::list и std::map сами выделяют себе динамическую память для хранения элементов по мере надобности. Независимо от того, как они описаны: глобальной переменной, переменной на стэке или выделены динамически. |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Как совершенно правильно заметил tzirechnoy, контейнеры (в том числе и std::list и std::map да и вообще все std::*) хранят данные своих клиентов в куче, поэтому располагать их самих в куче смымла нет никакого - их размер не превышает размера пары указателей, и не зависит от содержимого. Хранить в них вместо объектов указатели на них тоже не имеет смысла (по крайней мере для list и map), т.к. помещенные в них один раз объекты никуда не копируются (но это верно не для всех контейнеров!). Поэтому помещать в них указатели на объекты в куче - это лишняя трата кучи, приводящая к ее фрагментации и неэффективному использованию.
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |