当前位置: 首页 > 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;  // 判断数据是否共享

相关文章:

  • 探索常识性概念图谱:构建智能生活的知识桥梁
  • 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时区问题
  • 指纹锁在什么网站做宣传好/网推接单平台有哪些
  • 做淘宝客怎样建网站/广州抖音seo
  • 美食网站/盐城网站优化
  • 江苏省住房城乡建设厅网站首页/网络广告营销经典案例
  • 建设单位网站的重要性/seo招聘
  • 如何打开网站根目录/b站推广网站入口202