首页 > 其他分享 >Qt隐式共享

Qt隐式共享

时间:2023-05-08 17:15:25浏览次数:47  
标签:Qt 计数 复制 引用 共享 隐式

看了关于Qt隐式共享的介绍,很像之前学习的智能指针,复制对象的时候引用计数+1。

(1) 深拷贝 : 即就是生成对象的一个完整的复制品;

(2)浅拷贝:只是一个引用复制(比如仅仅复制指向共享数据的指针)。

(3)隐式共享:也叫做写时复制(copy on write)。Qt中的很多C++类通过使用隐式数据共享来最大化资源的使用效率和最小化复制的资源耗费。将隐式共享类作为参数传递不仅安全而且效率高,因为在这个过程中只有指向这个数据的指针被传递,并且当且仅当有函数对这个数据进行写操作时,才会对该数据进行复制。

隐式共享可以降低对内存和CPU资源的使用,提高程序的运行效率。使用隐式共享能使得在函数中(eg. 参数、返回值)使用值传递更有效率。  QString采用隐式共享技术,将深拷贝和浅拷贝很好地结合了起来。

隐式共享大多发生的背后,编程人员一般不需要关注它们。但是,隐式共享导致Qt的容器类和STL中的容器类有很大的不同。由于隐式共享,当复制一个容器时,它们其实是共享一份数据的。

参考: Qt文档阅读笔记-隐式共享(Implicit Sharing)深入研究(理论及实例)_IT1995的博客-CSDN博客 

1.上面这个博客有图可以清楚的看到隐式共享时的引用计数。

2.列出了Qt里一些隐式共享的类

参考: Qt隐式共享与显式共享_qt共享指针被保存在不同的容器中会增加引用计数吗?_求道玉的博客-CSDN博客

 

四、线程和隐式共享类
​ Qt对它的许多值类使用一种称为隐式共享的优化,尤其是QImage和QString。从Qt 4开始,隐式共享类可以安全地跨线程复制,就像任何其他值类一样。它们是完全可重入的。隐式分享确实是隐式的。

​ 在许多人的心目中,隐式共享和多线程是不兼容的概念,因为引用计数通常是这样做的。然而,Qt使用原子引用计数来确保共享数据的完整性,避免引用计数器的潜在损坏

​ 注意,原子引用计数不能保证线程安全性。在线程之间共享隐式共享类的实例时,应该使用适当的锁定。这是对所有重入类(无论是否共享)的相同要求。然而,原子引用计数确实保证了一个线程在其自身、隐式共享类的本地实例上工作是安全的。 所以说可以使用信号和槽机制在不同线程之间传递数据,因为这可以在不需要显式锁定的情况下完成。

​ 总之,Qt 4中的隐式共享类实际上是隐式共享的。即使在多线程应用程序中,也可以安全地使用。
参考: 【Qt】浅析Qt中的隐式共享_iriczhao的博客-CSDN博客

 

标签:Qt,计数,复制,引用,共享,隐式
From: https://www.cnblogs.com/littleheadache/p/17382321.html

相关文章

  • nas各种共享访问协议的使用(smb,nfs,ftp,ftps,sftp,afp,webdav)
    使用群晖、UNRAID、FREENAS等NAS系统的小伙伴肯定会有传输文件的需求,无论是在本地局域网还是远端设备,这种情况下当然可以使用群晖的WEB管理界面中FileStation,但是这种方式便捷性不够,于是nas与本地设备文件的传输最好的方式是挂载群晖的空间,挂载群晖空间的方式有非常多。主要有......
  • Qt XML 读写
    QtXML读写XML简介XML(ExtensibleMarkupLanguage)是一种类似于HTML,但是没有使用预定义标记的语言。有许多基于XML的语言,包括XHTML、MathML、SVG、RSS和RDF(en-US)。XML声明<?xmlversion="1.0"encoding="UTF-8"?>注释<!--Comment-->实体像HTML一样,XML......
  • 在linux上使用Qt开发动态库项目,怎么只生成一个so文件
     背景:在linux系统上,我们使用Qt开发动态库项目时,会默认生成四个文件:x.so 、x.so.1、x.so.1.0、x.so.1.0.0四个文件,只有一个真实的so库,剩下的三个都是链接文件。我们交付的时候,不可能发一堆文件出去,所以我们需要对Qt项目进行设置,保证输入的只有一个so文件......
  • QT Create 提示LINK1158:无法运行rc.exe
    使用everything搜索当前电脑上的rc.exe文件。以下是我电脑rc.exe的文件位置。由于我安装vs2015时目录没选到c:/programfile(x86)下(没安到默认目录),而是安装在D盘,那么就要使用D:\WindowsKits下的rc.exe文件。复制“rc.exe”和“rcdll.dll”文件,如果是x64复制x64文件夹下的俩......
  • linux GUI-QT6.5移植到Mini2440
    ----------------------------------------------------------------------------------------------------------------------------内核版本:linux5.2.8根文件系统:busybox1.25.0u-boot:2016.05开发板:Mini2440-----------------------------------------------------------------......
  • Book-Linux 系统编程-41章 共享库基础
    Book-Linux系统编程-41章共享库基础共享库是一种将库函数打包成一个单元使之能够在运行时被多个进程共享的技术。这种技术能够节省磁盘空间和RAM。41.1目标库构建程序的一种方式是简单地将每一个源文件编译成目标文件,然后将这些目标文件链接在一起组成一个可执行程序,如下所......
  • Qt中信号与槽
    1.什么是信号:信号的种类很多,不同的控件触发不同的特定信号例如button的信号:(在父类中可以找到)信号与槽同时是通过关联使用的。  2.什么是槽?槽:用于关联某一个控件的信号,信号触发的时候将会执行槽函数(槽函数的关联分为手动关联和自动关联)槽的自动关联;在前面板选中对应的控......
  • 创建一个简单的Qt工程
    1.打开QtCreator进行如下选择。(开软去官网下载即可,注册邮箱可以断网跳过)第一步:选择Application   第二步:这里文件名称和路径都不要有中文第三步:选择编译模式点击下一步第四步:选择Widget点击下一步 第五步:运行工程,判断是否创建成功课堂小记:1.析构函数不能......
  • 如何实现视频中两台电脑的实时屏幕共享
    1屏幕共享功能介绍屏幕共享是指在视频通话或互动直播过程中将屏幕内容以视频的方式分享给其他的观众,以增强互动体验,提高沟通效率。屏幕共享解决方案提升了用户实时视频通话的沟通效率。屏幕共享在如下场景中应用广泛:视频会议场景中,屏幕共享可以将讲话者本地的文件、数据、网页、PP......
  • 系统集成09-Samba文件共享服务器管理
    系统集成09-Samba文件共享服务器管理1Samba文件共享服务器搭建Samba文件共享服务介绍Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,SMB(ServerMessageBlock)服务器消息块。Samba最大的功能是可以用于Linux与windows系统直接的文件共享和打印共享,既可以用于Window......