2014-08-27 8 views
2

La polyvalence de QObject le rend assez grand.QObject léger - classe de base compatible

Je veux l'utiliser uniquement pour les propriétés statiques (essentiellement juste QMetaObject), sans encourir le massif 120 peine d'octets pour héritant de QObject.

Existe-t-il un équivalent léger?


Modifier

Voici les résultats de profilage - il est pénible d'avoir ~ 30MB perdu pour une tâche de taille moyenne (certains peuvent être ~ 20x plus). Notez le rapport b-écrit - le constructeur QObject définit beaucoup d'état qui n'est presque jamais inspecté.

==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

vous n'avez pas du tout besoin d'hériter de QObject. quelles sont les caractéristiques dont vous avez besoin? –

+0

'this-> metaObject() -> propriété (int)' et connexes. – qdot

+1

La compilation de méta s'applique uniquement aux types dérivés de QObject. De ma connaissance, il n'y a aucun moyen de le faire sans. Ou vous devrez mettre en place votre propre système de propriété. – jbh

Répondre

2

Vous pouvez jeter un oeil à Q_GADGET (pertinent pour les versions de Qt < 5.5)

Utilisation Q_GADGET au lieu de Q_OBJECT pour permettre à l'appui du système objet méta pour énumérations dans une classe qui n'est pas un QObject sous-classe. Q_GADGET rend un membre de classe, staticMetaObject, disponible. staticMetaObject est de type QMetaObject et fournit un accès aux énumérations déclarées avec Q_ENUMS. Q_GADGET est fourni uniquement pour C++.

Vous pouvez également définir/obtenir Q_FLAGS et Q_CLASSINFO cette façon, mais vous ne pouvez pas utiliser Q_PROPERTY, il vous suffit de tirer de QObject pour cela.

Edit:

Qt 5.5 ajoute les fonctionnalités supplémentaires suivantes:

Qt base: Vous pouvez maintenant avoir Q_PROPERTY et Q_INVOKABLE dans un Q_GADGET, et il y a un moyen d'interroger le QMetaObject d'un tel gadget en utilisant le système QMetaTYpe.

+0

Oui. Q_PROPERTY est ce que je suis après, j'ai peur. – qdot

1

Un QObject n'est pas une classe de valeur. Il est destiné à être utilisé pour ses comportements. Il peut souvent servir de façade à des instances non-objet. Par exemple, une instance d'objet unique peut agir comme un filtre d'événement pour plusieurs autres objets. Ainsi, même dans des systèmes relativement complexes, vous n'aurez pas beaucoup d'occurrences QObject. Son «poids» n'est donc pas très préoccupant.

La taille d'un objet dépend de la façon dont il est utilisé. Un objet sans connexions ou propriétés dynamiques occupe moins d'espace qu'un objet avec des connexions ou des propriétés dynamiques. L'espace requis doit être déterminé en instrumentant l'allocateur de mémoire ou en inspectant le code. Un QObject est une classe de handle et a lui-même une taille de deux pointeurs (un d-pointeur et un vtbl-pointeur). Le PIMPL prend de la mémoire supplémentaire, tout comme l'extension pimpl qui n'est pas allouée par défaut. Pour une perspective de perspective, la taille d'une instance de classe par ailleurs vide avec des méthodes virtuelles est de 8 octets sur un système 64 bits. Un QObject qui est simplement un ordre de grandeur plus grand qu'un pointeur est, je dirais, un vol. L'appeler lourd est IMHO absurde :) Sur ma machine, un std::map<std::string, QVariant> vide est 1/3 de la taille d'un QObject.

Si tout ce que vous voulez est un mécanisme de métaméthode statique, vous essayez probablement trop de tirer parti de moc. Vous pouvez utiliser un générateur de code, comme par exemple l'excellent gsl et créer le vôtre. Si vos besoins en mémoire sont si importants, vous aurez besoin d'une solution personnalisée de toute façon. Il vaut mieux avoir des informations sur les performances et le profilage pour sauvegarder votre désir de ne pas réutiliser QObject, cependant. Si vous souhaitez construire gsl en utilisant qmake, here's a qmake project for it.

Questions connexes