Экономия памяти
От: c0dex  
Дата: 19.12.03 11:25
Оценка:
Гуру ООП!
Подскажите пожалуйста, как лучше поступить в следующей ситуации.

Есть класс с большим количеством свойств и getters/setters к ним. В процессе выполнения программы создается большое количество(миллионы) объектов этого класса. Практически все созданные объекты необходимо держать в памяти. Но есть возможность сэкономить память, поскольку многие объекты создаются по шаблону(имеющему id) и большая часть свойств таких объектов дублируется.

Идея состоит в том, чтобы вынести наиболее часто дублирующиеся и неизменяемые, в процессе работы, свойства в отдельный класс и хранить readonly экземпляры этого класса в синглтоне.

Суть проблемы состоит в том, что необходимо также оставить возможность создавать полноценные ReadWrite объекты исходного класса. То-есть хочется создать видимость что исходный класс не изменился, но вырезать половину его свойств, а при запросе таких свойств отдавать их либо из readonly синглтона, либо из ReadWrite части, в зависимости от того "уникальный" это объект или нет.

Вобщем конечно можно ввести в описание исходного класса пару указателей на будущие классы-части. Например:
class cSource {
...
cObjectPart *ropart;
cObjectPart *rwpart;
...
};
И проверяя их на NULL "понимать" с каким типом объекта мы имеем дело и где искать его свойства. Но решение мне кажется некрасивым.

Отсюда вопрос: Есть ли в С++ какие-либо встроенные средства для решения такой задачи ? Что-то сходное с виртуальными методами возможно...
Re: Экономия памяти
От: Saddam Россия http://saddam.narod.ru
Дата: 19.12.03 11:31
Оценка:
Здравствуйте, c0dex, Вы писали:

А проверять на NULL в put\get-ерных функциях? Тогда снаружи тебя это волновать не будет
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re: Экономия памяти
От: _wqwa США  
Дата: 19.12.03 11:58
Оценка:
Здравствуйте, c0dex, Вы писали:

C>Есть класс с большим количеством свойств и getters/setters к ним. В процессе выполнения программы создается большое количество(миллионы) объектов этого класса. Практически все созданные объекты необходимо держать в памяти. Но есть возможность сэкономить память, поскольку многие объекты создаются по шаблону(имеющему id) и большая часть свойств таких объектов дублируется.


C>Идея состоит в том, чтобы вынести наиболее часто дублирующиеся и неизменяемые, в процессе работы, свойства в отдельный класс и хранить readonly экземпляры этого класса в синглтоне.


C>Суть проблемы состоит в том, что необходимо также оставить возможность создавать полноценные ReadWrite объекты исходного класса. То-есть хочется создать видимость что исходный класс не изменился, но вырезать половину его свойств, а при запросе таких свойств отдавать их либо из readonly синглтона, либо из ReadWrite части, в зависимости от того "уникальный" это объект или нет.


C>Вобщем конечно можно ввести в описание исходного класса пару указателей на будущие классы-части. Например:

C>class cSource {
C>...
C> cObjectPart *ropart;
C> cObjectPart *rwpart;
C>...
C>};
C>И проверяя их на NULL "понимать" с каким типом объекта мы имеем дело и где искать его свойства. Но решение мне кажется некрасивым.

C>Отсюда вопрос: Есть ли в С++ какие-либо встроенные средства для решения такой задачи ? Что-то сходное с виртуальными методами возможно...


Можно даже сделать немножко не так...
1. Разделить свойства твоего класса на несколько групп таким образом, чтобы в одной группе находились элементы, которые, вероятнее всего, будут изменяться одновременно друг с другом. Вы
2. Вынести каждую из этих групп свойств в отдельный класс/структуру.
3. В нашем исходном классе хранить указатели на динамически выделенные классы-хранилища свойств и флажки, указывающие своим ли экземпляром каждого класса-хранилища он пользуется..
4. При создании нового экземпляра исходного класса эти указатели инициализируем значениями указателей некоего объекта-эталона (а при копировании -- копируемого экземпляра).
5. При изменении свойства исходного класса функция-сеттер проверяет, чьим экземпляром свойства она сейчас пользуется, и если не своим, то сначала создает собственную копию класса-хранилища свойств.

Можно написать специализированный вариант смарт-указателя для таких классов хранилищ, чтобы не делать кучу проверок вручную.
... << RSDN@Home 1.1.0 stable >>

Внесены изменения автора. -- ПК.
Кто здесь?!
Re: Экономия памяти
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 19.12.03 12:49
Оценка: 14 (3) +1
Здравствуйте, c0dex, Вы писали:

C>Идея состоит в том, чтобы вынести наиболее часто дублирующиеся и неизменяемые, в процессе работы, свойства в отдельный класс и хранить readonly экземпляры этого класса в синглтоне.


Паттерн Flyweight?
Re[2]: Экономия памяти
От: c0dex  
Дата: 19.12.03 13:32
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:
_>Паттерн Flyweight?

. Спасибо за помощь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.