2013-08-06 27 views
2

我看過QT對信號/插槽機制應用了簽名規範化過程。 MOC生成器基本上從信號/插槽中刪除了常量參考限定符,並且僅通過值傳遞它們。QT得到規範化簽名有什麼好處

我有一個類,它會頻繁地生成一個名爲BIG_DATA的大數據結構,而其他類在每次發出時都需要捕獲這個數據結構。

struct BIG_DATA 
{ 
    // very big data 
}; 

class DataGenerator 
{ 
    // some methods which generate BIG_DATA 

    signals: 
     void data_updated(const BIG_DATA &); 
}; 

我該怎麼辦:

connect(&data_generator_object, SIGNAL(data_updated(const BIG_DATA &)), this, SLOT(catch_new_data(const BIG_DATA &))); 

什麼QT的作用:

connect(&data_generator_object, SIGNAL(data_updated(BIG_DATA)), this, SLOT(catch_new_data(BIG_DATA))); 

那麼,什麼是這裏除去常量引用預選賽的好處?我將如何處理將整個BIG_DATA複製到多個data_updated信號客戶端的開銷?

似乎最好的方法是使用指向生成的BIG_DATA對象的指針,如果QT不嘗試去除指針簽名。

+0

'connect'是一個函數聲明還是一個函數調用(或者是一個兼有兩者的古怪的宏)?它看起來像一個函數調用。函數調用中不要放入參數類型。 「SIGNAL」呢? –

+0

SIGNAL()和SLOT()只是將參數轉換爲char數組的宏。 connect()是一個函數調用。 –

回答

2

簽名規範化僅用於識別信號和插槽。也就是說,如果您想告訴connect()要使用哪個信號或插槽,則需要在此處傳遞標準化的簽名。但是你的信號和插槽的簽名保持不變。如果您使用直接連接(這是單線程程序的默認設置),則不會複製您的對象。

+0

你確定直接連接是單線程程序的默認設置嗎? –

+0

@BЈовић[AutoConnection是每個程序的默認設置](http://qt-project.org/doc/qt-5.1/qtcore/qt.html#ConnectionType-enum),但是在單線程上下文中,它將表現得很好與DirectConnection一樣。 – cgmb

1

如果您使用的是排隊連接,則無論如何都會複製您的結構(請參閱this)。

現在,如果你使用使用標準化的信號,您可以在您使用的連接減少性能損失(see this):

查找是第一次嘗試與簽名原樣,且僅當出現故障是調用QMetaObject :: normalizedSignature()。

這意味着,使用非標準化信號/槽簽名時,您不僅需要支付strcpy(),還需要支付首次查找失敗的嘗試。當然,連接通常是在啓動過程中完成的,分析器不會向您顯示,但是使用非標準化的簽名會被牢牢地置於過早悲觀的領域。

但是,性能命中僅在使用連接時發生,而不是在發送信號時。連接通常只進行一次。所以我不會太擔心。

爲了避免結構複製,請使用引用。