- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте, 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 >>
Внесены изменения автора. -- ПК.
Здравствуйте, desperado_gmbh, Вы писали:
_>Паттерн Flyweight?

. Спасибо за помощь!