2017-02-12 33 views
2

qtフレームワークでは、ほとんどのライブラリシグナルとスロットはポインタをパラメータとして使用します。私は、ポインタの代わりにパラメータとして参照を取るシグナルスロット "構造体"を作成すると、全体のパラメータがコピーされるか、通常のC++リファレンスのように4バイト(32ビットシステム)だけコピーされるのでしょうか?Qtシグナルとスロット:参照引数がコピーされていますか?

リファレンスパラメータで信号/スロットメソッドを作成したときに気が付いたので、これを尋ねます。私がconnectのとき、QTCreatorのオートコンプリートメカニズムは、ポインタパラメータと同じように、リファレンスパラメータで私にヒントしません。彼は、私は定期的なパラメータで私をヒント。例えば:

... 
signals: 
    void mySignal(int& parameter); 
private slots: 
    void on_mySignal(int& parameter); 

Iは、パラメータに参照のため&を追加doesntのそれらとQtを接続しようとする:私は手動に変更する必要が

... 
connect(this, SIGNAL(mySignal(int)), this, SLOT(on_mySignal(int))); 

I信号及びスロットを作成します:

connect(this, SIGNAL(mySignal(int&)), this, SLOT(on_mySignal(int&))); 

このように、私は信号が/ sロット?私はすべての助けに感謝します。

+1

あなたの前提に欠陥があります。通常のC++参照はオブジェクトではないのでサイズはありません。たとえば、 'sizeof'を使って参照のサイズを取得することはできません。また、廃止されたシグナル/スロット構文の使用をやめてください。適切な構文は 'connect(this、&Class :: mySignal、this、&Class :: on_mySignal);'です。これにより、心配する必要はありません。 – nwp

+0

ありがとうございます。しかし、主な質問に答えるには:参照信号/スロットを使用する場合は、コピーされているデータの大量ですか? – Bremen

+0

'int 'を指定しても、' int'のコピーが必要です。スロットの引数に代入し、渡されたパラメータが変更されたかどうかを調べることで、それをテストすることができます。 – nwp

答えて

5

参照を送受信する場合、デフォルトで同じスレッドではコピーは作成されません。値の送受信や別のスレッドへの参照の送信など、何か他の操作を行うと、1つ、2つまたは3つのコピーが作成されます。

どのようなことが起こるかは、接続タイプと、QTが参照によって有効であることを知る必要があることを確認する必要があります。同じスレッド上の直接接続は単純な関数呼び出しに解決されるため、基になるデータはほとんど発生しません。ただし、キューに入れられた接続では、実際にコールがいつ行われるかは保証されません。そのため、QTはデータの整合性を保つためにコピーを作成します。 QTはスレッド境界を横切る信号を暗黙的に待ち行列に入れます。

いずれかの側が値渡しの場合、QTはデータをコピーして基礎となるオブジェクトの状態に影響を与えません。

詳細については、have a look at this blog postを参照してください。

+1

ヨハン、あなたは正しくありません。コピーはスレッドに依存せず、スロット接続タイプに依存します。同じスレッドref引数でも、接続待ちの場合にコピーされます。 Qtのドキュメントを読む:http://doc.qt.io/qt-5/qt.html#ConnectionType-enum –

+0

ドミトリー、ありがとう。追加された説明。 – Johan

関連する問題