2014-08-27 57 views
2

QObject的多功能性使其相當大。輕量級QObject兼容基類

我想僅將它用於靜態屬性(本質上只是QMetaObject),而不會導致從QObject繼承的大量字節處罰。

是否有輕量級的等價物?


編輯

下面是分析結果 - 這是痛苦的具有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) 
+1

你根本不需要繼承QObject。你需要什麼功能? – 2014-08-27 15:35:58

+0

'this-> metaObject() - > property(int)'和相關的。 – qdot 2014-08-27 15:59:34

+1

元編譯僅適用於QObject派生類型。據我所知,沒有辦法沒有辦法。或者你將不得不實施自己的財產製度。 – jbh 2014-08-27 16:11:10

回答

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_PROPERTY和Q_INVOKABLE一個Q_GADGET內,並且有一種方法來查詢QMetaObject這種使用QMetaTYPE系統的小工具。

+0

是的。我擔心,Q_PROPERTY是我所追求的。 – qdot 2014-08-28 11:29:31

1

A QObject不是值類。它的目的是用於其行爲。它通常可以作爲非對象實例的外觀。例如,單個對象實例可以充當多個其他對象的事件過濾器。因此,即使在相當複雜的系統中,也不會有很多QObject實例。它的「重量」並不是那麼重要。

對象的大小取決於它的使用方式。沒有連接或動態屬性的對象比具有連接或動態屬性的對象佔用的空間更少。空間要求必須通過檢測內存分配器或檢查代碼來確定。 A QObject是一個句柄類,它本身具有兩個指針的大小(一個d指針和一個vtbl指針)。 PIMPL需要額外的內存,因爲默認情況下不會分配的pimpl擴展。

對於透視感,與虛擬方法的其他空類實例的大小是64位系統中的8個字節。 A QObject這僅僅比指針大一個數量級,我會說,竊取。調用它很重要是恕我直言荒謬:)在我的機器上,一個空的std::map<std::string, QVariant>是一個QObject的三分之一大小。

如果你想要的只是一個靜態元方法機制,你可能會努力去利用moc。你可以使用代碼生成器,比如說,優秀的gsl,並製作你自己的。如果您的內存需求非常重要,無論如何您都需要定製解決方案。不過,你最好有性能和分析信息來支持你不要再使用QObject的願望。如果你想用qmake構建gsl,here's a qmake project for it