当前位置: 首页 > 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.xdnf.cn/news/617311.html

相关文章:

  • 2025年电工杯B题思路讲解问题一四种算法
  • Java 集合框架核心知识点全解析:从入门到高频面试题(含 JDK 源码剖析)
  • 解决:dpkg: error: dpkg frontend lock is locked by another process
  • Coze工作流-变量聚合模块的应用
  • IEEE 流程
  • OSS对象存储如何避免被攻击恶意刷流量?
  • QT中延时的用法及定时器的用法
  • 异地容灾、热备与冷备:核心概念解析、技术对比及行业解决方案指南
  • 在Android APK中使用WebView加载Vue项目并实现文件导出
  • 电网绝缘子及破损、闪络缺陷YOLO数据集
  • 【工具变量】地级市创新重视程度数据及城市创新重视程度数据(2003-2025年)
  • 旅游信息检索
  • 每日算法-250523
  • 1.2.1+1.2.2计算机硬件的基本组成
  • 通信专业速成solidworks学习记录
  • 有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(上)
  • 本地分支git push 报错 fatal: The current branch XXXX has no upstream branch.
  • 负号和连接号的区别?
  • 【C++】20. AVL树的实现
  • Python+requests实现接口自动化测试
  • 机器学习 Day1
  • 【python】局域网内通过python远程重启另一台windows电脑
  • Ntfs!ReadIndexBuffer函数调用Ntfs!NtfsMapStream函数的参数FileOffset为什么是0
  • PPP 流程已经走到启动阶段并且成功进入了 “STAGE_START_PPP
  • Linux PXE批量装机+无人值守技术(自动化装机)
  • [特殊字符] GUNION SDK 接口调用方式说明(静态库 vs 动态库)
  • 树莓派的刷机和登录
  • 常见证书格式区别
  • 矩阵详解:线性代数在AI大模型中的核心支柱
  • win11 24H2 版本,运行.vbs错误:没有文件扩展“.vbs“的脚本引擎