在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&)));
因此我想知道,参考甚至可以使用信号/插槽吗?我将非常感谢你的帮助。
答案 0 :(得分:5)
如果您在同一个帖子上发送和接收引用,则默认情况下不会复制。如果您执行任何其他操作,包括发送/接收值或向另一个线程发送引用,将会生成一个,两个甚至三个副本。
发生的情况取决于连接类型和QT需要知道通过调用保持有效的保证。同一线程上的直接连接解析为简单的函数调用,因此底层数据几乎不会发生。但是,排队连接无法保证实际发生呼叫,因此QT将进行复制以保持数据完整性。 QT隐含地将信号排队穿过线程边界。
如果任何一方是按值传递,那么QT会复制数据,以免影响基础对象的状态。
有关详细信息,请have a look at this blog post。