2014-08-27 2 views
2

QAbject versatilty делает его довольно большим.Легкий QObject - совместимый базовый класс

Я хочу использовать его только для статических свойств (по существу, только QMetaObject), без возникновения массива байтовый штраф за наследование от QObject.

Есть ли легкий эквивалент?


Редактировать

Вот результаты профилирования - это больно, чтобы иметь ~ 30 Мб неиспользуемые для задачи среднего размера (некоторые из них могут быть ~ 20x больше). Обратите внимание на отношение b-записи - конструктор QObject устанавливает много состояний, которые почти никогда не проверяются.

==10302== ======== ORDERED BY decreasing "max-bytes-live": top 10 allocators ======== 
==10302== 
==10302== -------------------- 1 of 10 -------------------- 
==10302== max-live: 31,264,224 in 229,884 blocks 
==10302== tot-alloc: 31,264,224 in 229,884 blocks (avg size 136.00) 
==10302== deaths:  none (none of these blocks were freed) 
==10302== acc-ratios: 0.01 rd, 1.16 wr (459,768 b-read, 36,321,672 b-written) 
==10302== at 0x4C275C0: operator new(unsigned long) (in /usr/lib64/valgrind/vgpreload_exp-dhat-amd64-linux.so) 
==10302== by 0x53E1551: QObject::QObject(QObject*) (in /usr/lib64/qt4/libQtCore.so.4.8.5) 
==10302== by 0x50465CA: Util::Util() (util.h:84) 
+1

Вам вообще не нужно наследовать QObject. какие функции вам нужны? –

+0

'this-> metaObject() -> свойство (int)' и связанное. – qdot

+1

Мета-компиляция применяется только к типам производных QObject. Насколько я знаю, нет никакого способа справиться с этим. Или вам придется реализовать свою собственную систему собственности. – jbh

ответ

2

Вы могли бы взглянуть на Q_GADGET (соответствующие для Qt версии < 5,5)

Использование Q_GADGET вместо Q_OBJECT, чтобы включить поддержку мета системы объектного для перечислений в классе, который не является QObject подкласс. Q_GADGET делает член класса staticMetaObject доступным. staticMetaObject имеет тип QMetaObject и обеспечивает доступ к перечислениям, объявленным с помощью Q_ENUMS. Q_GADGET предоставляется только для C++.

Вы также можете установить/получить Q_FLAGS и Q_CLASSINFO этот путь, но вы не можете использовать Q_PROPERTY, вам просто нужно извлечь из QObject для этого.

Edit:

Qt 5.5 добавлены следующие дополнительные функциональные возможности:

Qt Core: Теперь вы можете иметь Q_PROPERTY и Q_INVOKABLE в Q_GADGET, и есть способ запроса QMetaObject такого гаджета с использованием системы QMetaTYpe.

+0

Да. Боюсь, что Q_PROPERTY - это то, что мне нужно. – qdot

1

A QObject не является классом значений. Он предназначен для использования в его поведении. Он часто может выступать как фасад для объектов, не являющихся объектами. Например, экземпляр одного объекта может действовать как фильтр событий для нескольких других объектов. Таким образом, даже в довольно сложных системах у вас не будет очень много QObject экземпляров. Его «вес» тогда не вызывает большого беспокойства.

Размер объекта зависит от того, как он используется. Объект без соединений или динамических свойств занимает меньше места, чем один с подключением или динамическими свойствами. Требование к пространству необходимо определить, используя распределитель памяти или проверив код. A QObject - класс дескриптора и сам по себе имеет размер двух указателей (d-указатель и vtbl-указатель). PIMPL занимает дополнительную память, равно как и расширение pimpl, которое по умолчанию не выделяется.

Для восприятия перспективы размер пустого экземпляра класса с виртуальными методами составляет 8 байтов в 64-битной системе. A QObject, что на порядок больше, чем указатель, я бы сказал, украсть. Называть его тяжелым IMHO нелепое :) На моей машине пустой std::map<std::string, QVariant> составляет 1/3 размером QObject.

Если все, что вам нужно, это статический механизм метаметода, вы, вероятно, слишком стараетесь использовать moc. Вы можете использовать генератор кода, например, отличный gsl и сделать свой собственный. Если ваши требования к памяти настолько важны, в любом случае вам понадобится настраиваемое решение. Тем не менее, вам лучше иметь информацию о производительности и профилировании, чтобы поддержать ваше желание не использовать повторно QObject. Если вы хотите построить gsl, используя qmake, here's a qmake project for it.

Смежные вопросы