在qt框架中,大多数库信号和槽都使用指针作为参数。我想知道,如果我创建一个信号槽“结构”,将引用作为参数而不是指针,是否会复制整个参数,或者像常规 c++ 引用一样仅复制 4 个字节(32 位系统)?
我问这个问题是因为当我使用参考参数创建信号/槽方法时我注意到了一些事情。当我那时connect
他们,QTCreator 中的自动完成机制不会像他对指针参数那样提示我引用参数。他用常规参数提示我。例如:
我创建一个信号和槽:
...
signals:
void mySignal(int& parameter);
private slots:
void on_mySignal(int& parameter);
然后我尝试连接它们,但 Qt 没有添加&
参数参考:
...
connect(this, SIGNAL(mySignal(int)), this, SLOT(on_mySignal(int)));
我必须手动更改为:
connect(this, SIGNAL(mySignal(int&)), this, SLOT(on_mySignal(int&)));
因此我想知道,参考是否适用于信号/槽?我将不胜感激所有的帮助。
如果您在同一线程上发送和接收引用,则默认情况下不会创建任何副本。如果您执行其他操作,包括发送/接收值或发送对另一个线程的引用,则会创建一份、两份甚至三份副本。
发生的情况取决于连接类型以及 QT 需要知道引用在调用过程中保持有效的保证。同一线程上的直接连接解析为简单的函数调用,因此底层数据几乎不会发生任何变化。然而,排队连接无法保证调用何时实际发生,因此 QT 将制作副本以保持数据完整性。 QT 隐式地对跨线程边界的信号进行排队。
如果任一方都是按值传递,则 QT 会复制数据以不影响底层对象的状态。
了解更多信息,看看这篇博文 http://www.embeddeduse.com/2013/06/29/copied-or-not-copied-arguments-signals-slots/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)