Qt中自定义类的隐式共享

时间:2017-11-14 15:17:43

标签: c++ qt c++11

隐式共享是Qt值容器类的一个有趣特性,因此在性能和内存使用情况下使用自定义隐式共享类会很好,我正在弄清楚如何实现它。

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

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

从COW(写入时复制)的角度来看,这种方法更好,因为COW将以更小的粒度执行,对于只读它没有多少价值的对象来说

Q1: 任何人都可以向我解释隐式共享包含大量成员的自定义类的缺点和优势(> 50)

Q2: 据我所知,隐式共享类将受益于Qt命名空间内的SharedData Class,所以是否可以拥有自定义隐式共享类?那个自定义类里面的Qt类型成员呢? 我不是指移动已知的C ++ 11的语义,Qt更强大

1 个答案:

答案 0 :(得分:1)

包含大量成员的类的隐式共享的缺点和优点取决于所述成员的大小。它们与QString等其他类完全相同。您为每个写操作支付一个固定的引用计数时间,但您不必为深拷贝(内存分配,成员变量构造函数调用等)付费,至少不会立即支付。是否应该为引用计数付费,取决于您的用例:如果您制作了大量只读大型数据集的副本,那么隐式共享将提升您的性能,但如果您制作了大量的小对象副本这将被写入,没有必要隐含共享。

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

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