2017-02-12 7 views
2

Dans le cadre qt, la plupart des signaux de bibliothèque et des logements utilisent des pointeurs comme paramètres. Je me demandais, Si je crée une "structure" de slot de signal qui prend une référence comme paramètre au lieu du pointeur, le paramètre entier sera-t-il copié, ou juste 4 bytes (système de 32 bits) comme dans une référence C++ normale?Signal Qt et slots: les arguments de référence sont-ils copiés?

Je pose cette question parce que j'ai remarqué quelque chose quand je crée une méthode de signal/slot avec le paramètre de référence. Quand je les ai ensuite, le mécanisme de saisie semi-automatique dans QTCreator ne me fait pas allusion aux paramètres de référence comme il le ferait avec les paramètres du pointeur. Il me fait signe avec le paramètre régulier. Par exemple:

Je crée un signal et la fente:

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

je tente ensuite de les connectés et Qt ne marche pas ajouter & pour référence dans le paramètre:

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

Je dois changer manuellement :

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

Ainsi je me demande, fait référence même travailler avec le signal/s lot? J'apprécierais toute aide.

+1

Votre prémisse est erronée. Les références C++ régulières n'ont pas de taille car ce ne sont pas des objets. Vous ne pouvez pas, par exemple, utiliser 'sizeof' pour obtenir la taille d'une référence. En outre, vous devez arrêter d'utiliser la syntaxe de signal/emplacement obsolète. La syntaxe correcte est 'connect (this, & Class :: mySignal, this, & Classe :: on_mySignal);' ce qui évite de devoir vous en préoccuper. – nwp

+0

Je comprends, merci. Mais pour répondre à la question principale: Si vous utilisez des signaux/slots avec référence, est-ce qu'une grande quantité de données est copiée? – Bremen

+0

Je m'attendrais à une copie du 'int' même si vous avez spécifié un' int & '. Vous pouvez tester cela en assignant à l'argument dans l'emplacement et voir si le paramètre que vous avez passé a changé. – nwp

Répondre

5

Si vous envoyez et recevez une référence, sur le même thread, par défaut, aucune copie ne sera effectuée. Si vous faites autre chose, y compris l'envoi/la réception d'une valeur ou l'envoi d'une référence à un autre sujet, une, deux, voire trois copies seront faites. Ce qui se passe dépend du type de connexion et des assurances dont QT a besoin pour savoir que les références restent valides pendant l'appel. Une connexion directe sur le même thread se résout à un appel de fonction simple, donc très peu peut arriver aux données sous-jacentes. Cependant, une connexion en file d'attente n'offre aucune garantie quant à la date à laquelle l'appel se produira. Par conséquent, QT effectuera des copies pour préserver l'intégrité des données. QT met implicitement en file d'attente des signaux traversant les limites de fil.

Si l'un des côtés est une valeur de passage, QT copie les données pour ne pas affecter l'état de l'objet sous-jacent.

Pour plus d'informations, have a look at this blog post.

+1

Johan, tu n'es pas correct. La copie ne dépend pas des threads, cela dépend du type de connexion. Même dans le même fil, les arguments ref sont copiés en cas de connexion en file d'attente. Lire la documentation Qt: http://doc.qt.io/qt-5/qt.html#ConnectionType-enum –

+0

Dmitry, merci. Ajout de clarification – Johan