Qt容器类的隐式共享机制与使用建议

Qt的容器类(以及一些容器类的派生类和Qt库内部类)使用隐式共享(Implicit Sharing)机制,以提升性能。这个机制保证复制Qt容器类以及许多内部类(包括QVector< T >QLinkedList< T >QList< T >QStringListQStack< T >QQueue< T >QMap< K , T >QMultiMap< K , T >QHash< K , T >QMultiHash< K , T >QStringQByteArrayQVariantQBrushQFont等)对象时,优先执行一个浅复制(影复制,可以简单理解为仅复制指向容器的指针),只有复制项发生改变时,才执行完全复制(深复制)。

Qt隐式共享机制的实现基础是QSharedDataQSharedDataPointer类。

为了利用隐式共享机制带来的在性能以及代码可读性方面的优化,推荐的工作流程包括:

  • 对于需要返回支持隐式共享机制的对象的函数,直接将该函数的返回类型设为这个对象的类型,而不再使用修改引用型参数的方法进行返回。
  • 只读访问非常量的向量(Vector)或列表(List)时,使用at()函数,而非[]操作符1
  • 只读访问非常量的键值对容器(关联容器,字典型容器,如QMap< K , T >QMultiMap< K , T >QHash< K , T >QMultiHash< K , T >等)的值时,使用value()函数,而非[]操作符2
  • 使用STL风格的迭代器C<T>::iterator时,对begin()end()函数的调用也会导致深复制。推荐的操作包括:
    • 使用返回常量的STL风格迭代器C<T>::const_iterator代替C<T>::iterator
    • 使用begin()end()函数的常量版本constBegin()constEnd()





参考资料:Jasmin Blanchette,Mark Summerfield.C++ GUI Qt4编程(第二版)[M].闫峰新,曾泉人,张志强,等译.电子工业出版社:北京,2018

需要注意的是,由于at()value()函数返回的是请求的数据的副本,而[]操作符返回的是请求的数据的引用,因此,当您的程序对性能敏感,且包含大量的读取操作时,使用[]操作符可能更为经济。

it
除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License