QSharedData和QCborMap
QSharedData
和 QCborMap
是 Qt 框架中的两个不同的类,用于不同的用途。下面是它们的详细介绍:
QSharedData
QSharedData
是 Qt 提供的一种用于实现数据共享的机制。它主要用于实现数据的共享和引用计数,通常与 QSharedDataPointer
一起使用。它们的组合使得实现数据的共享和拷贝变得更加高效。
主要功能和用途:
- 引用计数:
QSharedData
通过引用计数来管理共享数据的生命周期。当最后一个引用被销毁时,数据才会被删除。 - 数据共享:多个对象可以共享同一份数据,而不需要复制。这对于需要频繁拷贝大数据的场景非常有用。
- 写时拷贝(Copy-on-Write, COW):当共享数据需要被修改时,才会进行实际的拷贝操作,从而减少不必要的拷贝,提高性能。
示例代码:
#include <QSharedData>
#include <QSharedDataPointer>
#include <QString>
class MySharedData : public QSharedData {
public:
MySharedData() : value(0) {}
MySharedData(const MySharedData &other) : QSharedData(other), value(other.value) {}
int value;
};
class MyClass {
public:
MyClass() : data(new MySharedData) {}
MyClass(const MyClass &other) : data(other.data) {}
MyClass &operator=(const MyClass &other) {
if (this != &other) {
data = other.data;
}
return *this;
}
int value() const { return data->value; }
void setValue(int value) { data->value = value; }
private:
QSharedDataPointer<MySharedData> data;
};
int main() {
MyClass a;
a.setValue(42);
MyClass b = a;
b.setValue(43);
// a 和 b 共享同一份数据,直到 b 修改数据时才会进行拷贝
return 0;
}
QCborMap
QCborMap
是 Qt 提供的一个类,用于处理 CBOR(Concise Binary Object Representation)格式的数据。CBOR 是一种二进制数据格式,类似于 JSON,但更紧凑和高效。
主要功能和用途:
- 存储键值对:
QCborMap
用于存储键值对,类似于QMap
或QHash
,但专门用于 CBOR 数据。 - 序列化和反序列化:它提供了将数据序列化为 CBOR 格式和从 CBOR 格式反序列化的功能。
- 高效传输和存储:由于 CBOR 格式的紧凑性,
QCborMap
适用于需要高效传输和存储的场景。
示例代码:
#include <QCborMap>
#include <QCborValue>
#include <QByteArray>
#include <QDebug>
int main() {
QCborMap map;
map.insert("key1", "value1");
map.insert("key2", 42);
// 序列化为 CBOR 格式
QByteArray cborData = QCborValue(map).toCbor();
// 反序列化回 QCborMap
QCborValue cborValue = QCborValue::fromCbor(cborData);
QCborMap deserializedMap = cborValue.toMap();
qDebug() << deserializedMap["key1"].toString(); // 输出 "value1"
qDebug() << deserializedMap["key2"].toInt(); // 输出 42
return 0;
}
总结
- QSharedData:用于实现数据共享和引用计数,通常与
QSharedDataPointer
一起使用,适合需要高效数据共享和写时拷贝的场景。 - QCborMap:用于处理 CBOR 格式的数据,适合需要高效二进制数据传输和存储的场景。