当前位置:网站首页>Qt 中的隐式共享
Qt 中的隐式共享
2022-08-11 01:18:00 【litanyuan】
背景
Qt 中的许多类都是使用隐式共享来最大化资源使用并最小化复制。其进行参数传递时采用浅拷贝方式,只传递指向数据的指针,并且只有在数据写入时才真的拷贝数据。
通过使用 Qt 提供的相关类,可以实现自定义的隐式共享类。
Qt 中的隐式共享
①.概述
Qt 中的 QString 是具有隐式共享特性的类。
②.代码示例
QString s1 = "hello world";
QString s2 = s1;
qDebug() << s1.constData();
qDebug() << s2.constData();

如上图所示,s1 和 s2 中包含的数据指向同一个地址,但如果一个字符串发生更改时,将会进行写时拷贝操作:
QString s1 = "hello world";
QString s2 = s1;
qDebug() << s1.constData();
qDebug() << s2.constData();
s2[0] = 'H';
qDebug() << "s2 更改后:";
qDebug() << s1.constData();
qDebug() << s2.constData();

隐式共享相关类
①.概述
Qt 提供了一套包含隐式共享机制的一些类。
②.QSharedData
QSharedData 是实现共享数据对象的基类。
③.QSharedDataPoint
QSharedDataPoint 是一个模板类,和 QSharedData 一起使用来实现隐式数据共享。
自定义隐式共享类
①.概述
使用 QSharedData 和 QSharedDataPoint 可以实现自定义的隐式共享类。
②.代码示例
struct demoClassData :public QSharedData
{
demoClassData(){
}
demoClassData(int m_id,const QString &m_name) :id(m_id), name(m_name){
}
int id{
-1};
QString name;
};
class demoClass
{
public:
demoClass():d(new demoClassData){
}
demoClass(int m_id, const QString &m_name):d(new demoClassData(m_id, m_name)) {
}
void setId(int m_id) {
d->id = m_id; }
void setName(const QString &m_name) {
d->name = m_name; }
void printData() {
qDebug() << d.constData(); }
private:
QSharedDataPointer<demoClassData> d;
};
demoClass d1(1, "aaaa");
demoClass d2 = d1;
d1.printData();
d2.printData();
d2.setName("bbbb");
qDebug() << "数据修改后";
d1.printData();
d2.printData();


边栏推荐
- 报考PMP需要做些什么准备?
- 颠覆性创新招商,链动2+1是个怎么样的制度模式?
- 分库分表ShardingSphere-JDBC笔记整理
- 什么是数组
- Apache Commons Configuration Remote Code Execution Vulnerability (CVE-2022-33980) Analysis & Reproduction
- SQL statement--get database table information, table name, column name, description comment, etc.
- 还在用 Xshell?你 out 了,推荐一个更现代的终端连接工具,好用到爆!
- C# using timer
- Linux install redis database
- How to convert url to obj or obj to url
猜你喜欢

ABP中的数据过滤器
![[21 Days Learning Challenge] Half Insertion Sort](/img/30/4971479a2fa08592e88f032bb23844.png)
[21 Days Learning Challenge] Half Insertion Sort

【21天学习挑战赛】折半插入排序

两日总结十一

WebView2 通过 PuppeteerSharp 实现RPA获取壁纸 (案例版)

Web APIs BOM - A Comprehensive Case of Operating Browsers

Elastic scaling of construction resources

Two-dimensional array combat project -------- "Minesweeper Game"

微信小程序通过URL Scheme动态的渲染数据

2022年PMP报考指南
随机推荐
vim简单保存窗口标识
Volatile和CAS
16. 最接近的三数之和
Apache Commons Configuration Remote Code Execution Vulnerability (CVE-2022-33980) Analysis & Reproduction
BEVDepth: Acquisition of Reliable Depth for Multi-view 3D Object Detection Paper Notes
③ 关系数据库标准语言SQL 数据查询(SELECT)
微信小程序强制更新版本
[GXYCTF2019]BabySQli
Ambari迁移Spark2到其它机器(图文教程)
C#使用计时器
loop word
嵌入式软件打log的一些心得
云原生-VMware虚拟机安装Kubesphere实战(一)
分库分表ShardingSphere-JDBC笔记整理
Distributed. Performance optimization
SAP ABAP JSON 格式数据处理
C# using timer
如何做到构建的提速,再提速
Linux install redis database
Successfully resolved raise TypeError('Unexpected feature_names type')TypeError: Unexpected feature_names type