当前位置: 首页 > news >正文

QString 写时拷贝简介

在 Qt 中,QString 实现了 写时拷贝(Copy-on-Write,COW) 机制,也叫做 隐式共享(Implicit Sharing)


一、什么是写时拷贝?

写时拷贝是一种 优化内存使用和性能 的技术:

  • 多个对象共享同一份数据(例如字符串内容)。
  • 当某个对象要修改数据时,才会真正复制一份数据(即“写时”才“拷贝”)。
  • 避免了不必要的内存分配和复制操作。

二、QString 的工作机制

Qt 的 QString值类型(像 intdouble 一样可以复制),但内部通过共享数据指针来实现优化。

示例代码:

QString a = "hello";
QString b = a;  // 并不会立即拷贝字符串内容,a 和 b 共用一份数据b[0] = 'H';     // b 要修改字符串,触发“写时拷贝”,此时才分离数据qDebug() << a;  // 输出 "hello"
qDebug() << b;  // 输出 "Hello"

在这段代码中:

  • b = a 不会触发内存拷贝;
  • b[0] = 'H' 这行才真正复制字符串内容并分配新内存。

三、内部实现简要说明

Qt 中使用了一个叫做 引用计数 的机制:

  • 每个 QString 底层共享一个 QStringData(实际存储内容);

  • 每次复制时,引用计数加一;

  • 当某个实例要修改数据时:

    • 如果引用计数 > 1,表示还有其他对象在用;
    • 此时它会创建一份新的副本(深拷贝);
    • 原来的那份仍由其他对象共享。

Qt 用了宏 Q_DECLARE_SHARED(QString)QSharedData 相关机制实现了这个行为。


四、好处与注意点

✅ 优点:

  • 节省内存;
  • 提高性能;
  • 对开发者透明,用起来像值类型,性能上接近指针/引用。

⚠️ 注意:

  • QString 是线程安全的 只读访问 是安全的;
  • 多线程写操作必须加锁或用副本。

总结

特性QString 写时拷贝行为
拷贝快速,共享数据
修改检查引用计数,必要时复制
性能优化减少内存分配与数据复制
对开发者透明像值类型一样使用

如果你想验证某次操作是否发生了深拷贝,可以使用:

qDebug() << QString::fromRawData(a.constData(), a.size()) == a;  // 判断数据是否共享
http://www.dtcms.com/a/209709.html

相关文章:

  • 探索常识性概念图谱:构建智能生活的知识桥梁
  • STM32 SPI通信(软件)
  • 【LINUX操作系统】线程池——线程部分综合运用并实现一个自己的线程池
  • [SWPUCTF 2021 新生赛]简简单单的解密
  • 疏锦行Python打卡 DAY 9 热力图和子图的绘制
  • C++---vector模拟实现
  • ld: cpu type/subtype in slice (arm64e.old) does not match fat header (arm64e)
  • 测试关键点
  • Java流式处理-Steam详解
  • 【Fifty Project - D30】
  • 告别手抖困扰:全方位健康护理指南
  • 《AI 绘画崛起,人类艺术家如何在夹缝中寻找新机遇?》
  • 电磁兼容(EMC)仿真(精编版)
  • MYSQL之复合查询
  • 实验13 数据库权限管理
  • Python语法特点与编码规范
  • CDGA|一线二线企业数据治理项目目前发展状况
  • 江科大DMA直接存储器访问hal库实现
  • Pytorch里面多任务Loss是加起来还是分别backward? | Pytorch | 深度学习
  • @JsonFormat时区问题
  • AB Sciex QTRAP 4500联用 Waters I Class plus 到货后如何安装和性能测试
  • Flink集成资源管理器
  • Android.mk解析
  • Web前端开发: 什么是JavaScript?
  • HC32f460的定时器时间分析
  • 可视化图解算法44:旋转数组的最小数字
  • 图解深度学习 - 特征工程(DL和ML的核心差异)
  • 决策树引导:如何选择最适合你的机器学习算法
  • [20250522]目前市场上主流AI开发板及算法盒子的芯片配置、架构及支持的AI推理框架的详细梳理
  • 支持电子病历四级的云HIS系统,云HIS系统源码,医院管理信息系统