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

Qt6之字符串类内存分配新变化——16的次方增加

qt提供了比标准c++ string更强大,更丰富,更实用的字符串类QString,它的主要功能22个已经在之前逐一分析过,感兴趣的可前往以下链接查看,本文主要重点分析下qt在字符串类上面做的优化,主要是两个方面,隐式共享内存分配策略

9-Qt6 QString和QChar_qchar qstring_闫有尽意无琼的博客-CSDN博客https://yanchenyu.blog.csdn.net/article/details/119640571 也可关注官方文档:

QString Class | Qt Core 6.5.0https://doc.qt.io/qt-6/qstring.html#details

一、隐式共享

共享类由一个共享数据块及指向这个块的计数器组成,当共享对象被创建,这个块的计数器的值会被设置为1,并且当有新的对象指向共享数据库,那么他的计数器就会+1,当对象不指向这个内存块时,计数器会减少,当计数器为0时,这个共享块将会被删除。

简单的说,当两个对象共享同一份数据时,如果数据不改变则不进行数据的复制(仅浅拷贝),而当数据改变时则进行数据复制即进行深拷贝。

浅拷贝,只做两件事情,设置一个指向共享数据块的指针,再修改引用计数的值;

深拷贝,生成一个对象的完整复制品;

显然深拷贝对资源的占用比如cpu、内存等将需要花费更多的资源,而浅拷贝仅仅是指针引用和计数,效率会非常高。

Qt的隐式共享技术,就是把浅拷贝和深度拷贝结合起来,以提高运行效率的同时还是资源占用降低。以下代码解释:

QString str1="china";qDebug()<<"&str1="<<str1.data_ptr();QString str2=str1;qDebug()<<"&str2="<<str2.data_ptr();str2.at(0);qDebug()<<"&str2.at(0)="<<str2.data_ptr();str2[0]='a';qDebug()<<"&str2="<<str2.data_ptr();qDebug()<<"&str1="<<str1.data_ptr();

 当第一次str2=str1,可以看到地址并未变化,说明仅发生了浅拷贝,它们指向同一个内容。

紧接着我们调用at去访问str2首元素后,地址仍未变化;

最后修改str2的第一个元素后,str2地址发生变化,因为已经进行了深拷贝,,也就是说它指向的数据结构已经是新的区域,指针地址也随之发生变化,即新的地址新的值,但str1此时地址仍未变化即最初的地址,也是最初的值。

以上,充分说明了,qt是深拷贝和浅拷贝进行结合使用,以最大化的减少资源占用,就是这一点一滴不知不觉的优化,积累起来提高效率。

二、内存分配策略

容器类 |Qt核心6.5.0https://doc.qt.io/qt-6/containers.html

 那我也用代码展示了,内存分配情况的确是文档中描述的,可以是8,24,56,120……;

 //上面qt6官方文档是如上面描述:

通过实验可以得出结论,qt6在内存方面发生了新变化,确实内存在以16的次方在增加,而不是再是所谓的qt5中众说纷纭的三种情况分配了。(截止23年5月号称所谓的qt6的新书还在继续宣扬下面的3种分配方式)。

而qt5时描述说分为3种情况:

  • QString每次分配4个字符,直到大小达到20个字符;
  • 当大小在20到4084个字符之间,每次分配内存块为当前空间大小(即为当前的2倍的速度增长)。准确地说,是分配下一个2的整数幂减12(即2^n-12)。这是因为在某些内存分配器中,会预分配几个字节的空间用于簿记内存开销(实现内存分配的时候会使用Bookkeeping,深入了解可前往内存管理内幕中查看“其它malloc实现”),因此分配大小为2的整数幂时性能较低。
  • 从4084字符开始,每次分配2048个字符(4096字节,即4KB,刚好等于一个32位逻辑地址空间计算机系统的页的大小),原因是现代操作系统重新分配一个缓冲区时不会将整个数据全部复制(隐式共享),物理页只进行简单地重新排序,实际上只需要复制首页和尾页的数据。

 总之无论qt采用过去的3种分配方式,还是现在16次方的分配方式,qt都是利用隐式共享和动态的内存分配策略,优化资源占用,提高效率。

相关文章:

Qt6之字符串类内存分配新变化——16的次方增加

qt提供了比标准c string更强大&#xff0c;更丰富&#xff0c;更实用的字符串类QString&#xff0c;它的主要功能22个已经在之前逐一分析过&#xff0c;感兴趣的可前往以下链接查看&#xff0c;本文主要重点分析下qt在字符串类上面做的优化&#xff0c;主要是两个方面&#xff…...

C++ 名称空间

一、名称空间 1.1、引入名称空间的背景 在C中的名称可以是变量&#xff0c;函数&#xff0c;类以及类的成员。随着项目的增大&#xff0c;名称相互冲突的可能性也在增大。使用多个厂商的类库时&#xff0c;可能导致名称冲突。例如&#xff0c;两个库都定义了名为List&#xff…...

作为一名普通的java程序员,我想和大家分享一下4年来的工作内容

一直有小伙伴想了解更多关于我的工作内容&#xff0c;所以今天我来分享一下我作为一名普通java程序员&#xff0c;4年来工作内容发生了哪些变化&#xff0c;以及我有什么感悟。 我是16届毕业生&#xff0c;我的第一份工作是做外包&#xff0c;第一年的时间里测试偏多&#xff…...

CyberLink的专业视频编辑软件ActionDirector Ultra 3.0版本在win10系统的下载与安装配置教程

目录 前言一、ActionDirector Ultra安装二、使用配置总结 前言 ActionDirector Ultra是CyberLink公司开发的专业视频编辑软件&#xff0c;旨在帮助用户创作高质量的运动和冒险视频。该工具提供了一些先进的特效和编辑工具&#xff0c;让用户能够轻松地剪辑、修剪、调整颜色和添…...

在外远程访问公司局域网用友畅捷通T财务软件 - 远程办公

文章目录 前言1.本地访问简介2. cpolar内网穿透3. 公网远程访问4. 固定公网地址 前言 用友畅捷通T适用于异地多组织、多机构对企业财务汇总的管理需求&#xff1b;全面支持企业对远程仓库、异地办事处的管理需求&#xff1b;全面满足企业财务业务一体化管理需求。企业一般将其…...

VariantAutoencoder(VAE)中使用生成好的模型进行声音生成

文章目录 概述一、soundgenerator.py文件soundgenerator.py实现代码一、convert_spectrogram_to_audio方法librosa.db_to_amplitudelibrosa.istft generate方法 二、generate.py文件实现代码load_fsdd函数说明select_spectrogram函数说明save_signals函数说明main函数说明 三、…...

C++数据封装以及定义结构的详细讲解鸭~

名字&#xff1a;阿玥的小东东 博客主页&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 定义结构 访问结构成员 结构作为函数参数 指向结构的指针 typedef 关键字 C 数据封装 数据封装的实例 设计策略 C 类 &…...

MySql 数据库的锁机制和原理

MySQL是一种流行的关系型数据库管理系统&#xff0c;广泛应用于各种Web应用程序和企业级应用程序中。在MySQL中&#xff0c;锁是一种用于控制并发访问的机制&#xff0c;它可以保证数据的一致性和完整性。本文将介绍MySQL的锁机制及原理&#xff0c;包括锁的类型、级别和实现原…...

try catch finally 里面有return的执行顺序

目录 实例结论 实例 1.try和catch中有return时&#xff0c;finally里面的语句会被执行吗 我们可以来分别看看 (1)执行try中的return时 public class Solution {public static int show() {try {return 1;}finally{System.out.println("finally模块被执行");}}publi…...

美团前高级测试工程师教你如何使用web自动化测试

一、自动化测试基本介绍 1 自动化测试概述&#xff1a; 什么是自动化测试&#xff1f;一般说来所有能替代人工测试的方式都属于自动化测试&#xff0c;即通过工具和脚本来模拟人执行用例的过程。 2 自动化测试的作用 减少软件测试时间与成本改进软件质量 通过扩大测试覆盖率…...

MySql.Data.dll 因版本问题造成报错的处理

NetCore 链接MySQL 报 Character set ‘utf8mb3‘ is not supported by .Net Framework 异常解决_character set utf8mb3_csdn_aspnet的博客-CSDN博客 查看mysql版本号&#xff0c;两种办法&#xff1a; 第一种在数据库中执行查询&#xff1a;SELECT version; 第二种使用工具…...

囚徒困境——从博弈论的角度解释“美女配丑男”

前言 有一种很常见的现象&#xff0c;美女配丑男。其实这种现象背后是有一定科学原理的。本文将从博弈论的角度&#xff0c;从囚徒困境出发解释这一现象产生的原因。 囚徒困境 囚徒困境的经典案例 先来介绍一下经典的囚徒困境。 警方逮捕甲、乙两名嫌疑犯&#xff0c;但没有…...

运算符重载函数作为类的成员函数——有理数的约分

目录 一、题目 二、代码 三、算法分析 &#xff08;一&#xff09;数学表达式 &#xff08;二&#xff09; 代码实现 一&#xff09;运算符重载函数 二&#xff09;优化函数&#xff08;实现有理数约分&#xff09; 一、题目 通过运算符重载为类的成员函数来实现两个有…...

mysql数据库的内置函数--7

目录 内置函数 日期函数 字符串函数 数学函数 其它函数 内置函数 在mysql中这些函数用select进行使用 日期函数 函数描述NOW()返回当前的日期和时间CURDATE()返回当前的日期CURTIME()返回当前的时间DATE()从日期或日期/时间表达式中提取日期部分TIME()从日期或日期/时间…...

DS3800HPIB 有效执行任务的所有程序

DS3800HPIB是通用电气公司生产的Speedtronic Mark IV系列的一部分。这DS3800HPIB是一种大型电路板&#xff0c;具有八个连接端子&#xff0c;电路板两侧的尺寸各不相同。左下角有一个红色小方块&#xff0c;上面有一个拨动开关。这DS3800HPIB有大约50个天蓝色的小二极管。这DS3…...

图像比对、人像比对和人脸识别的区别是什么?

图像比对、人像比对和人脸识别都是图像处理技术&#xff0c;但是它们的实现方式和应用场景均有所不同。 图像比对 图像比对是指通过计算机视觉技术将两张或多张图片进行相似度比较。主要包括图像特征提取、匹配和评估等步骤&#xff0c;通常使用神经网络等深度学习技术来实现…...

python中的抽象基类

目录 协议和鸭子类型抽象基类定义抽象基类使用抽象基类直接继承通过注册&#xff08;register&#xff09; __subclasshook__魔法方法 协议和鸭子类型 python中有大量的魔法方法&#xff0c;python所谓基于协议编程&#xff0c;就是依赖这些魔法方法。 什么意思呢&#xff1f…...

耗时几个月,终于决定把原本想用于商业的系统开源了

前言 嗨&#xff0c;大家好&#xff0c;我是希留&#xff0c;一个被迫致力于全栈开发的老菜鸟。 今天又来给小伙伴们分享一个基于 SpringBoot Vue 实现的前后端分离后台管理系统项目&#xff1b; 简介 这个项目是基于xiliu-tenant脚手架项目搭建而成&#xff0c;原本是帮朋…...

HarmonyOS应用端云一体化开发主要流程

图示 主要步骤 序号 阶段 任务 说明 1 创建端云一体化开发工程 选择工程类型与云开发模板 确定工程类型&#xff1a;选择“Application”或“Atomic Service”页签&#xff0c;确定创建的是HarmonyOS应用工程还是原子化服务工程。选择云开发模板&#xff0c;包括通用云开…...

NoSQL之 Redis配置与优化

NoSQL之 Redis配置与优化 ---------------------- 关系数据库与非关系型数据库 ---------------------------------------- ●关系型数据库&#xff1a; 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一…...

从零实现富文本编辑器#-React可编辑节点的组件预设泄

1. 智能软件工程的范式转移&#xff1a;从库集成到原生框架演进 在生成式人工智能&#xff08;Generative AI&#xff09;从单纯的文本生成向具备自主规划与执行能力的“代理化&#xff08;Agentic&#xff09;”系统跨越的过程中&#xff0c;.NET 生态系统正在经历一场自该平台…...

如何快速搭建个人飞行监控系统:完整ADS-B信号解码实战指南

如何快速搭建个人飞行监控系统&#xff1a;完整ADS-B信号解码实战指南 【免费下载链接】dump1090 Dump1090 is a simple Mode S decoder for RTLSDR devices 项目地址: https://gitcode.com/gh_mirrors/dump/dump1090 想要实时追踪头顶飞过的航班吗&#xff1f;梦想拥有…...

3倍极速突破:Gofile多线程下载器实战指南

3倍极速突破&#xff1a;Gofile多线程下载器实战指南 【免费下载链接】gofile-downloader Download files from https://gofile.io 项目地址: https://gitcode.com/gh_mirrors/go/gofile-downloader 在文件传输成为日常刚需的数字时代&#xff0c;你是否曾因Gofile大文件…...

Gemma-3-270m惊艳作品:生成可直接导入Postman的API测试集合JSON

Gemma-3-270m惊艳作品&#xff1a;生成可直接导入Postman的API测试集合JSON 如果你是一名开发者&#xff0c;肯定遇到过这样的烦恼&#xff1a;每次开发新API都需要手动在Postman里一个个创建测试请求&#xff0c;费时费力还容易出错。今天我要分享一个超级实用的技巧——用Ge…...

我们如何设计「多云-混合云」架构以规避供应商锁定?

在数字化转型的浪潮中&#xff0c;企业越来越依赖云计算来提升业务敏捷性和降低成本。过度依赖单一云服务供应商可能导致「供应商锁定」风险&#xff0c;使企业在技术、成本和控制权上陷入被动。如何通过「多云/混合云」架构设计规避这一风险&#xff1f;本文将从三个关键角度展…...

Python-SoundFile音频处理实战指南:从入门到精通的高效开发方案

Python-SoundFile音频处理实战指南&#xff1a;从入门到精通的高效开发方案 【免费下载链接】python-soundfile SoundFile is an audio library based on libsndfile, CFFI, and NumPy 项目地址: https://gitcode.com/gh_mirrors/py/python-soundfile Python-SoundFile是…...

前端使用AI试水报告旁

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容&#xff1a; 渲染代码&#xff1a; # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-temp…...

FIFA 23 Live Editor终极指南:免费修改工具完整使用方法

FIFA 23 Live Editor终极指南&#xff1a;免费修改工具完整使用方法 【免费下载链接】FIFA-23-Live-Editor FIFA 23 Live Editor 项目地址: https://gitcode.com/gh_mirrors/fi/FIFA-23-Live-Editor 还在为FIFA 23生涯模式中的种种限制而烦恼吗&#xff1f;想要打造属于…...

AI 术语通俗词典:中位数

中位数是统计学、数据分析、机器学习和人工智能中非常基础的一个术语。它用来描述一组数据按大小规律排序后&#xff0c;位于中间位置的数值。换句话说&#xff0c;中位数是在回答&#xff1a;如果把这组数据从小到大排好&#xff0c;最中间的那个位置在哪里。如果说平均数回答…...

Qwen3.5-9B助力VSCode高效开发:CodeX风格智能编码实战

Qwen3.5-9B助力VSCode高效开发&#xff1a;CodeX风格智能编码实战 1. 为什么需要本地化智能编码助手 在软件开发过程中&#xff0c;代码补全和智能提示已经成为提升效率的刚需。但主流云端方案如GitHub Copilot存在几个痛点&#xff1a;网络延迟影响响应速度、企业代码安全顾…...