当前位置:网站首页>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();
边栏推荐
猜你喜欢
HW-蓝队工作流程(1)
容器技术真的是环境管理的救星吗?
rhel7.0解决yum无法使用(system is not registered to Red Hat Subscription Management)
Kunpeng compilation and debugging and basic knowledge of native development tools
QT+VTK+PCL拟合圆柱并计算起始点、中止点
力扣------值相等的最小索引
wincc如何实现远程监控1200PLC
J9 Digital Theory: DAO governance is more like an ecological process: governance is native to the network and continues to evolve
MySQL advanced query
[21 Days Learning Challenge] Half Insertion Sort
随机推荐
Mysql数据库安装配置详细教程
Only lazy and hungry. You still don't understand the singleton pattern!
postgresql参数意义
php 判断数组是否为多维数组
【服务器数据恢复】raid5崩溃导致lvm信息和VXFS文件系统损坏的数据恢复案例
The SAP ABAP JSON format data processing
MySQL indexes and transactions
【视频】报告分享|2021年保险行业数字化洞察
url转成obj或者obj转成url的方法
② 关系数据库标准语言SQL 数据定义(创建、修改基本表)、数据更新(增删改)
vim简单保存窗口标识
总结Qt中常用文件信息QFileInfo的获取:后缀,名称,路径,链接
Two-dimensional array combat project -------- "Minesweeper Game"
Ambari迁移Spark2到其它机器(图文教程)
20张图,全面掌握MVCC原理!
Use mysql statement to operate data table (table)
什么是“门”电路(电子硬件)
嵌入式软件打log的一些心得
Linux安装redis数据库
Sub-database sub-table ShardingSphere-JDBC notes arrangement