Russian Qt Forum
Ноябрь 22, 2024, 05:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Оптимальное хранение члена класса  (Прочитано 4708 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июль 22, 2020, 13:33 »

Добрый день

Есть базовый класс с членом m_polygons
Код
C++ (Qt)
struct CBasePrimitive {
...
 Polygons * m_polygons;
...
};
Сейчас он создается в конструкторе и удаляется в деструкторе (scoped в масть, ну то мелочи). Этот класс наследуется 2 десятками др классов, для каждого порожденного класса член m_polygons создается один и тот же, т.е. вроде бы он должен быть singleton'ом каждого порожденного. Но есть 2 исключения

а) CModelPrimitive - для него m_polygons зависит от др члена - строки "name" (имя модели загружаемой с диска)

b) CDetailPrimitive - для него m_polygons зависит от др члена - int "details" (уровень деталировки)

Для этих порожденных можно сделать статик мапы, для остальных singleton'ы. Но все-таки уж очень много классов менять - нет ли более элегантного решения?

Спасибо
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Июль 22, 2020, 17:43 »

Замутить свой "Implicit Sharing" или взять QByteArray ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июль 23, 2020, 13:40 »

Замутить свой "Implicit Sharing" или взять QByteArray ?
Ну хорошо, пусть m_polygons был бы QByteArray, т.е имплисит шара для него поддерживается. И что с того ?
Код
C++ (Qt)
CDerivedPrimitive::CDerivedPrimitive( void )
{
 ..
 m_polygon = ???
 ..
}
Сейчас здесь создаются данные точно такие же как и для предыдущего экземпляра, имплисит шара сама по себе от этого дубляжа не избавляет. Вот если бы мы копировали.. (но об этом речь не идет)
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #3 : Июль 23, 2020, 19:54 »

имплисит шара сама по себе от этого дубляжа не избавляет

если данные точно такие же, то избавляет
Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #4 : Октябрь 27, 2020, 21:41 »

А просто три синглтона без всяких мап, соответственно, для CBasePrimitive, CModelPrimitive, CDetailPrimitive:
Код:
Polygons* poligonsInstance()
{
static auto result = new Polygons;
return result;
}

Polygons* poligonsInstance(const QString& name)
{
static auto result = new Polygons(name);  // или как там они создаются в зависимости от name/details
return result;
}

Polygons* poligonsInstance(int details)
{
static auto result = new Polygons(details);
return result;
}
Ну или если они должны быть в области видимости классов, то делать их static protected, соответственно. Эти синглтоны (Мейерса) инициализируются при первом обращении, thread-safe. Если указатель не может принимать нулевого значения по смыслу, то я использую во всех таких случаях ссылку. Т.е.:
Polygons& poligonsInstance(int details)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 22.