轻量级QObject兼容的基类

时间:2014-08-27 15:30:18

标签: c++ qt

QObject的多功能性导致它相当大。

我只想将它用于静态属性(基本上只是QMetaObject),而不会因继承QObject而导致大量的 120 字节惩罚。

是否有轻量级的等效产品?


修改

以下是分析结果 - 对于中型任务浪费了大约30MB(有些可能大约20倍)是很痛苦的。注意b-written比率--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)

2 个答案:

答案 0 :(得分: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派生即可。

修改:

Qt 5.5增加了以下额外功能:

  

Qt核心:   您现在可以在Q_GADGET中拥有Q_PROPERTY和Q_INVOKABLE,并且可以使用QMetaTYpe系统查询此类小工具的QMetaObject。

答案 1 :(得分:1)

QObject不是值类。它旨在用于其行为。它通常可以充当非对象实例的外观。例如,单个对象实例可以充当多个其他对象的事件过滤器。因此,即使在相当复杂的系统中,也不会有很多QObject个实例。它的“重量”并不是那么令人担忧。

对象的大小取决于它的使用方式。没有连接或动态属性的对象比具有连接或动态属性的对象占用更少的空间。必须通过检测内存分配器或检查代码来确定空间要求。 QObject是一个句柄类,它本身的大小为两个指针(一个d指针和一个vtbl指针)。 PIMPL需要额外的内存,默认情况下没有分配的pimpl扩展。

对于透视感,使用虚方法的其他空类实例的大小在64位系统上是8个字节。 QObject只比指针大一个数量级,我会说,窃取。嘲笑它是恕我直言:)在我的机器上,空std::map<std::string, QVariant>QObject的1/3。

如果您只想要一个静态元方法机制,那么您可能会过于努力地利用moc。您可以使用代码生成器,比如说优秀的gsl并创建自己的代码生成器。如果您的内存要求如此重要,那么无论如何您都需要一个自定义解决方案。不过,您最好使用性能和分析信息来支持不再重复使用QObject的愿望。如果您希望使用qmake构建gsl,here's a qmake project for it