Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Март 29, 2021, 11:11



Название: Шаринг регулярных данных
Отправлено: Igors от Март 29, 2021, 11:11
Добрый день

Есть простецкий член класса
Код
C++ (Qt)
struct CMaterial {
...
 std::vector<int> mIndex;
...
};
И вот обнаружилось что "иной раз" этот mIndex интенсивно повторяется и жрет немало RAM и раздувает файлы данных (> 1 Gb). Напрашивается его "зашарить", причем хотелось бы это сделать "малой кровью", проблема возникает далеко не всегда.
Цитировать
Используй QVector вместо std::vector - и будет тебе счастье
[off]
Давая такие ответы человек полагает что "шлифует свое мастерство" :), но это рано или поздно проходит, и он покидает форум
[/off]
Ну хорошо, допустим имплисит шара мне автоматом "расшарит", пусть придется отследить [] и at(). А как "вернуть взад" при undo? И как писать/читать из файлов/потоков избегая "дубляжа"? А если std::shared_ptr ("Qt только для UI") то я не имею даже авто-расшаринга. Придется городить какую-то свою систему. Конечно это не так уж сложно, но это же "в чистом виде" велик, где же общность? Или возможны "более солидные" решения?

Другой вопрос, который я бы тоже охотно пообсуждал: а не "мелкотравчатый" ли этот подход? Очевидно что дублируется вся структура CMaterial, вот ее и надо шарить! Тут я не знаю как, потому что CMaterial имеет разнообразные члены ссылки/ID на владельца, которые у копий не равны.

Спасибо


Название: Re: Шаринг регулярных данных
Отправлено: Igors от Март 31, 2021, 14:42
"И тишина..". А ведь не так уж давно каждым вторым словом было "шаред" или "юник", несчастные "голые" указатели безжалостно истреблялись и.т.п. Наверное мне никогда не угнаться за модой :) Ну ладно, сделал свой велик, получился какой-то "тоже шаред" но который не имеет ничего общего со стандартным. Конечно это плохо
Код
C++ (Qt)
template <class T>
struct CShared {
CShared( void );
CShared( const CShared & other );
~CShared( void );
 
CShared & operator = ( const CShared & other );
 
const T & GetData2Read( void ) const;
T & GetData2Edit( void );
 
void SetData ( const T & data );
void FinishEdit ( void );
bool InEdit ( void ) const;
 
static void PrintSets ( void );
 
private:
void Remove ( void );
void Add2Read ( const T & data );
 
// data members
T * mData = 0;
 
static std::set<T *, ContentLess<T>> mSetRead;
static std::set<T *> mSetEdit;
};
Я конечно понимаю что там большие, умные дяди "которые знают плюсы в 100 раз лучше", а я тут лезу со своими "костылями". Но что остается если нужного мне ф-ционала нету, хоть лопни  :'(

Вообще стандартный шаред не то чтобы "плох", но мне ни разу не удавалось  его "развить", получить больше возможностей чем стандартных.