当前位置: 首页 > 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;一…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...