是否可能,如果可以,如何在 Qt 中创建一个对共享指针常量引用的信号/槽?我想要一个如下所示的信号:
void signal( shared_ptr<SomeClass> const & )
我知道如何在没有常量引用的情况下做到这一点,这只是类型shared_ptr<SomeClass>
但出于效率*原因,我想避免复制。引用类型的相同语法不起作用:
Q_DECLARE_METATYPE(shared_ptr<SomeClass> const &)
qRegisterMetaType<shared_ptr<SomeClass> const&>();
许多标准 API 都具有QString const &
所以我认为这从根本上是可能的,但我只是无法弄清楚语法。
**性能的最大问题不是复制时间,而是对象复制到每个接收器时的互斥锁锁定/解锁量——接收器数量很多。当多个线程使用该对象时,这会带来明显的减慢/瓶颈。如果shared_ptr实际上只使用原子操作,那么这个成本也是微不足道的,但是关于信号中const引用的一般问题仍然存在。*
到目前为止,我发现我可以简单地这样做:
Q_DECLARE_METATYPE(shared_ptr<SomeClass>)
qRegisterMetaType<shared_ptr<SomeClass> >();
qRegisterMetaType<shared_ptr<SomeClass> >("std::shared_ptr<SomeClass>const&");
我现在正在尝试验证这是否真的可以正常工作。这里的文档并不清楚实际发生的情况。信号/槽中的 const 引用类型似乎将被编组为普通类型shared_ptr<SomeClass>
,这里完全没问题。不过,如果有某种保证能够正常工作那就太好了。
我的感觉就是简单shared_ptr<SomeClass>
版本是所需要的一切,它是boost
干扰信号的命名空间。第二个版本似乎只是将信号注册到全局命名空间中以方便使用。
通过测试我可以确认const &
正如所提到的,这部分在排队连接中完全被忽略。每个连接的槽都会获得该对象的一个新副本。这是非常不幸的。 :(
进一步的测试表明&
用于插槽,但以一种不寻常的方式。仍会为排队连接创建对象的副本,但如果不使用引用,则会为调用创建另一个副本。
因此,尽管每个connect
最终将复制排队连接的数据,参考文献仍然有一点帮助。而且,如果您确实在本地(同一线程)发送了一些信号,您可以避免更多的复制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)