警告
本节包含自动从C++翻译到Python的片段,可能包含错误。
隐式共享#
Qt中的许多C++类使用隐式数据共享来最大化资源使用并最小化复制。隐式共享类在作为参数传递时既安全又高效,因为只传递数据的指针,并且数据只有在函数写入时才复制,即写时复制。
概述#
共享类由指向共享数据块的指针组成,该数据块包含引用计数和数据。
创建共享对象时,它将引用计数设置为1。每当新的对象引用共享数据时,引用计数会增加,当对象取消引用共享数据时减少。当引用计数变为零时,共享数据将被删除。
处理共享对象时,有两种复制对象的方法。我们通常谈论深度复制和浅度复制。深度复制意味着复制一个对象。浅度复制是引用复制,即指向共享数据块的指针。深度复制可能会在内存和CPU方面非常昂贵。浅度复制非常快,因为它只涉及设置指针并增加引用计数。
隐式共享对象的赋值(使用operator=())是通过浅度复制实现的。
共享的好处是程序无需不必要地复制数据,从而降低内存使用并减少数据复制。对象可以轻松赋值、作为函数参数发送和从函数返回。
隐式共享主要在幕后进行;程序员很少需要担心它。但是,Qt的容器迭代器与STL的迭代器行为不同。请参阅隐式共享迭代器问题 。
在多线程应用程序中,隐式共享与在“线程和隐式共享类”中解释的方式相同。
实现自己的隐式共享类时,请使用QSharedData
和QSharedDataPointer
类。
隐式共享的详细说明#
当对象即将更改并且引用计数大于1时,隐式共享会自动将对象从共享块中分离出来(这通常被称为写时复制或值语义)。
隐式共享类控制其内部数据。在任何修改其数据的成员函数中,它自动在修改数据之前分离出来。但是请注意,容器迭代器有一个特殊情况;请参阅隐式共享迭代器问题 。
使用隐式共享的QPen类在所有更改内部数据的成员函数中从共享数据中分离出来。
代码片段
def setStyle(self, style): detach() # detach from common data d.style = style # set the style member def detach(self): if d.ref != 1: ... // perform a deep copy
类列表#
以下列出的类在对象即将改变时将自动与公共数据分离。程序员甚至不会注意到对象是被共享的。因此,你应该将这些类的单独实例视为单独的对象。它们始终表现出独立的对象行为,但同时在可能的情况下共享数据。因此,你可以将此类类的实例作为按值传递给函数的参数,而不用担心复制的开销。
示例
p1, = QPixmap() p1.load("image.bmp") p2 = p1 # p1 and p2 share data paint = QPainter() paint.begin(p2) # cuts p2 loose from p1 paint.drawText(0,50, "Hi") paint.end()
在这个示例中,由于调用 p2
的 QPainter::begin() 将修改它,因此 p1
和 p2
在调用前共享数据。
警告
在使用 STL-style iterator 时小心处理隐式共享容器(QMap
、QList
等)。请参阅 隐式共享迭代器问题 。
|
QDebug 类提供了一个调试信息的输出流。 |
QDir 类提供对目录结构和内容的访问。 |
|
QFileInfo 类提供一种在文件系统中检索条目信息的 OS 专用 API。 |
|
QProcessEnvironment 类用于保存可传递给程序的环命令。 |
|
提供有关当前挂载的存储和驱动器的信息。 |
|
QUrl 类提供了一个处理 URLs 的便捷接口。 |
|
QUrlQuery 类提供了一种处理 URL 查询中键值对的方法。 |
|
QPersistentModelIndex 类用于在数据模型中定位数据。 |
|
|
QVariant 类类似于最常见 Qt 数据类型的联合体。 |
QMimeType 类用 MIME 类型字符串表示文件的类型。 |
|
QJsonArray 类封装了 JSON 数组。 |
|
QJsonDocument 类提供了一个读写 JSON 文档的方法。 |
|
|
QJsonObject 类封装了 JSON 对象。 |
QJsonParseError 类用于报告 JSON 解析过程中的错误。 |
|
QJsonValue 类封装了 JSON 中的值。 |
|
QByteArray 类提供了一个字节数组。 |
|
|
QByteArrayList 类提供了一个字节数组的列表。 |
|
QByteArrayView 类提供了一个在字节数组上的视图,具有只读子集的 QByteArray API。 |
QCollator 类根据局部化排序算法比较字符串。 |
|
QCollatorSortKey 类可用于加快字符串排序速度。 |
|
QLocale 类在多种语言之间转换数字及其字符串表示形式。 |
|
QRegularExpression 类提供了使用正则表达式进行模式匹配的功能。 |
|
QRegularExpressionMatch 类提供了将 QRegularExpression 与字符串匹配的结果。 |
|
QRegularExpressionMatchIterator 类提供了在字符串上对 QRegularExpression 对象全局匹配结果的迭代器。 |
|
|
QString 类提供了一个 Unicode 字符串。 |
|
QStringList类提供字符串列表。 |
QTextBoundaryFinder类提供了一种在字符串中查找Unicode文本边界的方法。 |
|
QDateTime类提供日期和时间函数。 |
|
QBitArray类提供位数组。 |
|
|
QCache类是一个提供缓存的模板类。 |
QCommandLineOption类定义了一个可能的命令行选项。 |
|
|
QContiguousCache类是一个提供连续缓存的模板类。 |
|
QHash类是一个提供基于哈希表字典的模板类。 |
|
QMultiHash类是一个提供多值哈希的便捷QHash子类。 |
|
QList类是一个提供动态数组的模板类。 |
|
QMap类是一个提供关联数组的模板类。 |
|
QMultiMap类是一个提供具有多个等价键的关联数组的模板类。 |
|
QQueue类是一个提供队列的通用容器。 |
|
QSet类是一个提供基于哈希表集的模板类。 |
|
QStack类是一个提供堆栈的模板类。 |