Qt:隐式内存共享

news2024/9/17 7:24:08

隐式内存共享

Many C++ classes in Qt use implicit data sharing to maximize resource usage and minimize copying. Implicitly shared classes are both safe and efficient when passed as arguments, because only a pointer to the data is passed around, and the data is copied only if and when a function writes to it, i.e., copy-on-write

下面是官方文档对于隐式转换说明:

Qt中的许多C++类使用隐式数据共享来最大限度地提高资源使用率并最大限度地减少复制。当作为参数传递时,隐式共享类既安全又高效,因为只有指向数据的指针会被传递,并且只有当函数向数据写入时,数据才会被复制,即写时复制

QT官网:隐式共享

共享类

共享类由指向共享数据块的指针组成,该数据块包含引用计数和数据

创建共享对象时,会将引用计数设置为1。每当新对象引用共享数据时,引用计数就会增加,当对象取消引用共享数据后,引用计数会减少。当引用计数为零时,共享数据将被删除。

qt中所有使用隐式数据共享的类,其赋值运算符**operator=**采用的都是浅拷贝

即只拷贝指针,共享数据块引用加一,在隐式共享类任何修改其数据的成员函数中,它都会在修改数据之前自动分离出一块新的内存空间(当共享数据块中的引用计数为1的时候会直接更改共享数据块,而不是创建新的内存空间),并对新的内存空间进行修改(除容器迭代器)。

推荐浅拷贝使用

一般情况下我们可以默认使用**opertot=**中的浅拷贝即可,这样会优化内存空间和拷贝效率,即使我们想改其中的内容也不需要担心,因为在进行写入的时候共享类就会在写入函数中自动进行内存分离,创建新的共享内存块,修改也只会在新的共享内存块上修改。

如果真的想显式进行深拷贝,需要调用共享类的特定函数,例如:QImage的copy()函数

QImage的bits()和constBits()

两个函数都是返回第一个像素元素地址,bits()返回的是一个变量指针,所以QImage内部当引用计数不为0时会有一次深拷贝,分配一个新的内存空间。constBits()返回的是一个常亮指针,所以QImage内部不会有深拷贝。

Qimage和Qpixmap中的内存共享

QImage和QPixmap类使用隐式数据共享,可以按值传递对象,如果没有修改操作则不会有深拷贝消耗。
1:创建两个QImage,使用=号赋值,未做修改操作则内存地址相同,引用计数为2
在这里插入图片描述

2:QImage作为参数,使用值传递,函数内部不对QImage做修改的话,也不会有只拷贝,但共享内存的引用计数会加1。下面使用值拷贝,引用技术变为4,分别为:qimage, qimage1, Test函数内部的行参,局部变量m
在这里插入图片描述
3:QPixmap创建时,其内部也有一个共享内存指针,不过使用默认的QPixmap::fromImage()创建时会开辟一个新的空间,可以看到pixmap内存地址和qimage不一样,且引用计数为1。此时会有一次内存拷贝的消耗在这里插入图片描述
4:当我们从QImage转换为QPixmap不想要内存拷贝消耗时,例如频繁的更新图像显示,可以添加标志Qt::ImageConversionFlag::NoFormatConversion。下图可以看到三个变量内存地址相同,引用计数为3。
在这里插入图片描述
5:当发生写入或者修改时,就会出现对共享内存的复制(即深拷贝)。例如下面Qpainter对图片进行绘制,绘制之前两个QImage内存相同,绘制开始后则qimage1内存地址发生改变(分配了一个新的空间),qimage引用计数变为1
在这里插入图片描述
改变后:
在这里插入图片描述

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

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

相关文章

K8s实战4-使用Helm在Azure上部署Ingress-Nginx和Tokengateway

手动发布Ingress-Nginx 1 登录到aks(dfinder-gw-aks) az login az account set --subscription ${sub ID} az aks get-credentials --resource-group ${groupname} --name ${aks name} 2 下载 ingress-nginx-4.2.5.tgz curl -LO https://github.com/kubernetes/ingress-ngi…

Hyper-V增加桥接网络设置(其他方式类同)

点击连接到的服务器,右单击或者右边点击“虚拟交换机管理器” 选择网络种类 配置虚拟交换机信息 外部网络选择物理机网卡设备

CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题

CS1988|C#无法在异步方法中使用ref,in,out类型的参数 🌀|场景: BlazorServer的场景中推荐使用异步方法,使用ref,out,in为参数前缀则报错CS1988 原因如下: ref parameters are not supported in async methods because the method may not h…

torch模型转onnx

加载模型 modeltorch.load(saved_model/moudle_best_auc.pth, map_locationcpu) model.eval().cpu()注:由于导出的模型是用于推理的,因此必须指定模型加载的位置和模型验证的位置,这里我使用了cpu做出导出的硬件 分析模型的输入和输出 这里…

基于SSH框架实现的管理系统(包含java源码+数据库)

资料下载链接 介绍 基于SSH框架的管理系统 简洁版 ; 实现 登录 、 注册 、 增 、 删 、 改 、 查 ; 可继续完善增加前端、校验、其他功能等; 可作为 SSH(Structs Spring Hibernate)项目 开发练习基础模型&#xf…

维护平衡的艺术:如何与干系人建立和谐关系以确保项目成功

在项目管理领域中,干系人的作用是无法忽视的。他们的支持和参与往往是项目成功的关键。与干系人建立和维护良好的关系成为每一位项目经理必备的技能。接下来,我们将深入探讨如何有效地与干系人互动,从而为项目的成功奠定坚实基础。 干系人的…

中国“诺贝尔奖”未来科学大奖公布2023年获奖名单

未来科学大奖委员会于8月16日公布2023年获奖名单。柴继杰、周俭民因发现抗病小体并阐明其结构和在抗植物病虫害中的功能做出的开创性工作获得“生命科学奖”,赵忠贤、陈仙辉因对高温超导材料的突破性发现和对转变温度的系统性提升所做出的开创性贡献获得“物质科学奖…

2023骨传导耳机推荐,适合运动骨传导耳机推荐

相信很多人跟我一样,随着现在五花八门的耳机品种增多,选耳机的时候真是眼花缭乱,尤其还是网购,只能看,不能试,所以选择起来比较困难, 作为一个运动达人,为了让大家在购买耳机时少走弯…

YOLO系列解读DAY1—YOLOV1预训练模型

一、说在前面 小伙伴们好,博主很久没有写博客了,略感生疏,不到之处敬请谅解,欢迎指出文中错误,大家一起探讨。欲看视频讲解,可转至博主DouYin、B站,欢迎关注,链接如下: …

Cat(1):Cat入门

1 什么是调用链监控 1.1 架构的演进历史 单体应用 架构说明: 全部功能集中在一个项目内(All in one)。 在单体应用的年代,分析线上问题主要靠日志以及系统级别的指标。 微服务架构 架构说明: 将系统服务层完全独立…

亚马逊添加心愿单对卖家有什么好处

在亚马逊平台上,卖家可以从消费者的角度来看待心愿单的好处。消费者可以将自己感兴趣的商品添加到心愿单中,这对卖家来说也是有一些潜在好处的: 1、潜在销售机会增加:当消费者将商品添加到心愿单中,这可能表示他们对这…

mySQL 视图 VIEW

简化版的创建视图 create view 视图名 as select col ...coln from 表create view 视图名(依次别名) as select col ...coln from 表create view 视图名 as select col “别名1”,。。。col "别名n" from 表show tab…

Angular安全专辑之二——‘unsafe-eval’不是以下内容安全策略中允许的脚本源

一:错误出现 这个错误的意思是,拒绝将字符串评估为 JavaScript,因为‘unsafe-eval’不是以下内容安全策略中允许的脚本源。 二:错误场景 testEval() {const data eval("var sum2 new Function(a, b, return a b); sum2(em…

挖掘优质短视频超百万条,火山引擎DataLeap助力电商平台生态治理

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 在人们的日常生活中,网购已经成为人们生活中不可或缺的购物形式。 根据《中国社交电商行业发展白皮书(2022)》的数据显示&#x…

古战策与现代项目: 孙子兵法在项目管理中的应用

项目管理在当今的商业环境中是至关重要的。从初创公司到世界500强,项目管理的策略和工具都在不断地演变。然而,我们是否可以从古老的战争策略中汲取智慧,并将它们应用于现代的项目管理实践中呢? 让我们通过孙子兵法,一个古老而又…

ui设计师工作总结及计划范文模板

ui设计师工作总结及计划范文模板【篇一】 白驹过隙,转眼间某某年已近结尾,时间伴随着我们的脚步急驰而去,到了个人工作总结的时候,蓦然回首,才发现过去的一年不还能画上圆满的句号,内心感慨万千&#xff0c…

【PySide】Pyside QtWebEngine网页浏览器打开Flash网页

说明 QWebEngineView 加载 flash插件,可成功显示Flash,如图 源代码 # -*- coding: utf-8 -*- """ @File : pyside_2.py @Time : 2023/8/17 0:11 @Author : KmBase @Version : 1.0 @Contact : @Desc : None """import…

AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 摘要模型架构Embedding层Transformer Encoder层MLP Head 整体流程 摘要 虽然Transformer体系结构已经成为自然语言处理任务的事实上的标准,但它在计算机视觉方面的应用仍然有限。在视…

传统算法是如何在销补调计划中发挥作用的

本文分享了一个「传统机器学习算法」在实际业务中的使用场景。 前言 如果嫌麻烦,你可以直接跳到正题观看~ 最近无论是在工作中的交谈,还是在日常刷屏的新闻,铺天盖地的都是大模型。我横竖是看不明白,费了大劲终于从字缝里看到了两…

后端项目打包上传服务器记录

后端项目打包上传服务器记录 文章目录 后端项目打包上传服务器记录1、项目打包2、jar包上传服务器 本文记录打包一个后端项目,上传公司服务器的过程。 1、项目打包 通过IDEA的插件进行打包: 打成一个jar包,jar包的位置在控制台可以看到。 2、…