Как QVariant работает внутри?

Я хочу знать, как QVariant может хранить внутри, int, QMap, QList, ...

Я имею в виду, что такое внутренняя структура данных / реализация? Каковы накладные расходы на хранение и получение типов (int, float) в QVariant?


person SunnyShah    schedule 13.02.2011    source источник


Ответы (1)


Беглый взгляд на код показывает, что QVariant - это, по сути, union из нескольких примитивных типов (int, float и т. Д.), Указатель QObject и указатель void* для всего, что не является QObject и не примитивом. Существует также член данных типа, который позволяет ему знать, что на самом деле там хранится. Накладные расходы, похоже, не намного больше, чем хранение в члене структуры, проверка его совместимости типов и, возможно, преобразование (например, int в float)

person shoosh    schedule 13.02.2011
comment
В качестве дополнительных накладных расходов также необходимо сохранить базовый тип. Это составляет QVariant всего 16 байтов: 8 байтов (самый большой тип примитива) + 4 байта (информация о типе) + 4 байта (заполнение). - person hrr; 30.11.2011
comment
По крайней мере, на данный момент у него есть сутенер. Я думаю, что размер сейчас 32 байта, 16 для QVariant и 16 для QVariant::Private. По крайней мере, это то, что мне говорит sizeof. Я не считал их вручную. - person derM; 22.09.2017