繁体   English   中英

Qt中自定义类的隐式共享

[英]Implicit sharing for custom classes in Qt

隐式共享是Qt值容器类的一个有趣功能,因此,在性能和内存使用情况下,具有自定义的隐式共享类将非常有用,我正在研究如何实现它。

对于包含一些POD成员和Qt值类型成员的自定义类,隐式共享将自动提供给每个Qt值类型的成员,例如QString,QByteArray和...

在这种方法中,问题在于每个成员都有其特定的sharedPtr和引用计数,对于具有50个以上隐式共享成员的大对象,它认为独立检查每个对象的引用计数(对于分离)会降低性能。从我的角度来看,最好隐式共享整个对象,这样可以减少共享类所需的总内存消耗和操作。

从COW(写入时复制)的角度来看,此方法更好,因为COW将以较小的粒度执行,但是对于只读对象而言,它并不值得

Q1:谁能向我解释隐式共享包含大量成员(> 50)的自定义类的弊端和优势

Q2:据我所知,隐式共享类将从Qt命名空间中的SharedData类中受益,所以有可能有一个自定义的隐式共享类吗? 自定义类中的Qt类型成员呢? 我并不是说已经知道的C ++ 11的移动语义,Qt一个更强大

对于包含大量成员的类进行隐式共享的缺点和优势取决于所述成员的大小。 它们与QString等其他类完全相同。 您为每个写操作的引用计数花费固定的时间,但是不必为深度复制(内存分配,成员变量构造函数调用等)付出代价,至少不必立即付出代价。 是否需要为引用计数付费,取决于您的用例:如果您对大型数据集进行大量只读副本,则隐式共享将提高性能,但是如果您对小型对象进行大量复制,则可以提高性能。将会被写入,隐式共享毫无意义。

QSharedDataQSharedDataPointer是有用的工具,但是您可以自由地为自己的类使用写时复制的任何其他实现。 即使它们包含Qt类。

同样,不要比较移动语义和写时复制,它们会做不同的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM