Повторное использование Qtring COW / ref для Qt в реестре строк

0

Я работаю над проектом, который должен иметь большое количество объектов (в диапазоне миллионов), и хотя имена объектов не являются обязательными, они поддерживаются для удобства пользователя. Было бы довольно большой накладной иметь пустой член строки или даже указатель строки для каждого объекта, учитывая, что именованные объекты будут немногочисленными и далеко друг от друга. Также бывает так, что имена объектов очень часто используются повторно.

Поэтому я решил создать реестр имен, в основном QHash<Object*, QString*> который отслеживает каждый объект с именем, назначенным ему, и другой строковый реестр, который является QHash<QString, uint> который отслеживает использование count для каждой строки. Когда объекты называются, они регистрируются в реестре имен, когда имя изменено или объект удален, они незарегистрированы, а сам реестр имен управляет реестром строк, создает строки, отслеживает количество использования и, при необходимости, удаляет записи которые больше не используются.

Я чувствую, что второй реестр может быть избыточным, так как Qt уже использует подсчет ссылок для своей схемы COW, поэтому мне интересно, как я могу использовать эту уже существующую функциональность, чтобы исключить реестр строк и более эффективно использовать количество использования строк и время жизни?

  • 0
    Почему бы вам просто не взглянуть на исходный код Qt и посмотреть, как они это делают?
  • 0
    @MrEricSir - я знаю, как это работает, вопрос в том, как повторно использовать его за пределами предполагаемого шаблона использования.
Теги:
qt
qstring
reference-counting

1 ответ

0

user3735658, по какой-то причине я склонен полагать, что хеш-таблица не несет в себе исходную ключевую строку, а только хэш. Возможно, ваша проблема с избыточным объектом QString недействительна (?). Это немного вопрос, хотя... Теоретически, там не должно быть реальной строки. Таким образом, вы, вероятно, можете установить ключ для всего, что недействительно в контексте вашего приложения, например, "Безымянный 0bj666" в случае, если объект не привязан к строке, но все же сможет найти его через хэш-таблицу/это то, где он получает сложно, может быть, нет, из-за неспособности разрешить конфликты путем сопоставления с оригиналом /.

И, возможно, я не отвечаю точно так, как вы просили, но это может сработать, как насчет

QHash<QString, QSharedDataPointer<YourType1>> collection1;
QHash<QString, QSharedDataPointer<YourType2>> collection2; 
QHash<QString, QSharedDataPointer<YourType3>> collection3;

или, может быть, только один

QHash<QString, QSharedDataPointer<YourBasicType>> collection;

Использование QSharedDataPointer здесь представляется решением до тех пор, пока вы выберете YourType из QSharedData для немедленного переноса контрольного счетчика с объектом. Таким образом, у нас есть надлежащая система отслеживания для всех "плавающих" ссылок, которые используются практически везде в программе. Конечно, вы создаете экземпляр только один раз, а затем предоставляете const ref для QSharedDataPointer для пользователя вашего объекта.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню