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

news2025/1/18 8:52:13

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都是利用隐式共享和动态的内存分配策略,优化资源占用,提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当产品进化遇见亿元福利,华帝携手人民日报为消费复苏添了一把火

这个五一黄金周&#xff0c;消费复苏的热火彻底被点燃。统计数据显示&#xff0c;2023年“五一”假期累计超过2.74亿人次出游&#xff0c;消费市场恢复到2019年同期水平。久违的“人间烟火气”再度回归。 除了旅游市场的火爆&#xff0c;同样助燃消费市场的还有全民“厨房焕新…

使用Vue+Python基于卷积神经网络前后端分离实现蔬菜种类预测系统

使用VuePython基于卷积神经网络前后端分离实现蔬菜种类预测系统 一、实现效果 1、种类预测界面 2、数据处理分析界面 3、网络模型界面 4、结果分析界面 二、需求分析 用户通过上传待预测图片到系统&#xff0c;系统预测出该图片对应的蔬菜种类&#xff0c;并且提示用户预测信…

基于Web的智慧储能电站3D可视化管理平台

电能作为现代社会的运转和发展的基础&#xff0c;是民生最基本的保障&#xff0c;其稳定性对国家经济发展至关重要。 建设背景 电力系统是一个稳态平衡系统&#xff0c;发电站的总发电功率需要等于用户端的总发电功率。如果两者不一致&#xff0c;就会导致整个电力系统的不稳…

[PyTorch][chapter 34][池化层与采样]

前言&#xff1a; 这里主要讲解一下卷积神经网络中的池化层与采样 目录 DownSampleMax poolingavg poolingupsampleReLu 1&#xff1a; DownSample 下采样,间隔一定行或者列进行采样&#xff0c;达到降维效果 早期LeNet-5 就采样该采样方式。 LeNet-5 2 Max pooling 最大值采样…

【28岁了,没有职业规划,没有目标,朋友推荐学云计算技术,能成吗?】

一般来说&#xff0c;当然可以的。云计算是一个不断发展的行业&#xff0c;不考虑年龄的因素&#xff0c;任何人都可以学习和掌握云计算的技能。28岁的年龄入行云计算是可行的&#xff0c;年龄方面还是符合企业的要求&#xff0c;而且云计算领域的发展趋势也显示出越来越多的企…

RIDGID里奇金属管线检测仪故障定位仪维修SR-20KIT

里奇RIDGID管线定位仪/检测仪/探测仪维修SR-20 SR-24 SR-60 美国里奇SeekTech SR-20管线定位仪对于初次使用定位仪的用户或经验丰富的用户&#xff0c;都同样可以轻易上手使用SR-20。SR-20提供许多设置和参数&#xff0c;使得大多数复杂的定位工作变得很容易。此外&#xff0c…

国内ChatGPT使用教程

猿说AI助手系统基于中国开源项目进行开发&#xff0c;由神诺网络科技工作室提供技术支持&#xff0c;后面我们会跟随官方持续更新。对话默认运行的是3.5-turbo模型&#xff0c;绘画采用Midjourney接口&#xff0c;待更新百度文心、通义千问、微信WeLM等。本系统仅用于技术研究&…

【k8s】【ELK】基于节点DaemonSet运行日志Agent实践【待写】

1.日志收集场景分析与说明 部署架构说明 对于那些将日志输出到&#xff0c;stdout与stderr的Pod&#xff0c; 可以直接使用DaemonSet控制器在每个Node节点上运行一个 <font colorred>filebeat、logstash、fluentd </font>容器进行统一的收集&#xff0c;而后写入…

论文阅读-DGM4-Detecting and Grounding Multi-Modal Media Manipulation

一、论文信息 论文名称&#xff1a;Detecting and Grounding Multi-Modal Media Manipulation 作者团队&#xff1a;南洋理工哈工大 Github:https://github.com/rshaojimmy/MultiModal-DeepFake 项目主页&#xff1a;https://rshaojimmy.github.io/Projects/MultiModal-DeepF…

在EasyCVR平台中添加设备提示成功但不显示是什么原因?

EasyCVR视频融合平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持海量视频汇聚管理&#xff0c;可支持多协议接入&#xff0c;包括市场主流标准协议与厂家私有协议及SDK&#xff0c;如&#xff1a;国标GB28181、RTMP、RTSP/Onvi…

JECloud 运行前端模块所遇到的问题 汇总

1.依赖安装问题 官网 JECLoud 前端打包部署 1.1 部署前 注意 可以先下载 jecloud-libs 项目 尝试 部署安装 node版本不能过高&#xff01;选择node v14.17.5 版本 在部署前 如果当前node版本过高可以使用 nvm工具 切换到低版本&#xff0c; 但是需要注意的是 切换版本时 …

内网渗透(七十五)之域权限维持之DCShadow

DCShadow 2018年1月24日,在BlueHat安全会议上,安全研究员Benjamin Delpy 和 Vincent Le Toux 公布了针对微软活动目录域的一种新型攻击技术------DCShaow。利用该攻击技术,具有域管理员权限或企业管理员权限的恶意攻击者可以创建恶意域控,然后利用域控间正常同步数据的功能…

接口自动化测试-Requests之Session鉴权关联接口实战

目录 前言&#xff1a; 一、 简介 二、 实战操作 1. 登录接口 2. 查询订单接口 3. 新增订单接口 4. 修改订单接口 5. 删除订单接口 三、 结束语 前言&#xff1a; 接口自动化测试是软件测试过程中的重要一环&#xff0c;现在越来越多的公司开始使用自动化测试来提高测…

某社交平台 x-s所有可用

本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 最新版 x-s 没露任何版权请审核员认真对待谢谢。 【2023.05.16】 更新全站接口通用 …

webpack食用指北

目录 何为webpackwebpack前置知识webpack项目初始化webpack配置文件运行webpack loadercss引入对loader的配置的几种写法 图片引入url的options自动清除上次打包遗留的资源 资源模块类型图片的webpack5引入方式字体的webpack5引入方式 webpack插件html-webpack-plugincopy-webp…

CSS 常用属性

padding (内边距):钻戒到盒子内边框的距离 margin (外边距):钻戒盒子距离桌子边缘的距离 border:钻戒盒子边框宽度 1) 内边距和外边距 内边距 外边距 使用方式: .a {padding: 10px 5px 15px 20px; /*上右下左*/padding: 10px 5px 15px; /*上右下*/padding: 10px 5px; /*上右…

EMC常见术语-dB、dBm、dBw以及如何计算

1. 手把手教&#xff1a;如何计算dB、dBm、dBw…… dB应该是无线通信中最基本、最习以为常的一个概念了。我们常说“传播损耗是xx dB”、“发射功率是xx dBm”、“天线增益是xx dBi”…… 有时&#xff0c;这些长得很像的dBx们可能被弄混&#xff0c;甚至造成计算失误。它们究…

docker Connection refused

环境介绍、服务版本、测试服务是否正常&#xff0c;可参考&#xff1a; docker could not find driver_龙枫995的博客-CSDN博客docker容器中&#xff0c;php和mysql互动时&#xff0c;解决出现could not find driverhttps://blog.csdn.net/longfeng995/article/details/130704…

Ngrok免费实现内网穿透

Ngrok免费实现内网穿透 前言 平时我们做项目&#xff0c;有时候需要用到内网穿透&#xff0c;让外网可以正常访问我们的资源。网上虽然有内网穿透工具&#xff0c;但是很多都是收费的&#xff0c;比如像我曾经用过的花生壳&#xff0c;好用是好用&#xff0c;但是要收费。我的…

微服务注册中心之Zookeeper,Eureka,Nacos,Consul,Kubernetes区别

文章目录 1 微服务注册中心1.1 注册中心概念1.1.1 为什么需要注册中心1.1.2 如何实现一个注册中心1.1.3 如何解决负载均衡的问题 1.2 注册中心如何选型1.2.1 Zookeeper1.2.2 Eureka1.2.3 Nacos1.2.4 Consul1.2.5 Kubernetes 1 微服务注册中心 微服务的注册中心目前主流的有以下…