Qt:隱式內存共享

隱式內存共享

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.pswp.cn/news/41054.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41054.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41054.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言:每日一練(選擇+編程)

目錄 選擇題: 題一: 題二: 題三: 題四: 題五: 編程題: 題一:打印1到最大的n位數 示例1 思路一: 題二:計算日期到天數轉換 示例1 思路一&#xf…

【JVM】如何判定一個對象已死以及“標記-清除”、“標記-復制”、“標記-整理”三種垃圾收集算法

文章目錄 0、如何判定一個對象的生死?1、上文提到的引用又是什么1、強引用:2、軟引用:3、弱引用:4、虛引用: 2、垃圾收集算法1、標記-清除2、標記-復制優化:👇 3、標記-整理 0、如何判定一個對象…

Java面向對象程序設計——知識、概念、定義及作用(簡答)

?專欄:《Java面向對象程序設計》學習筆記 問題是依據考綱整理的,稍微做了一些補充。大部分答案由GPT生成,部分內容摘選自書本。 內容太多了,目前懶得濃縮精煉了,以后再說吧。 如果有大佬可以幫忙精簡一些文字、補充…

R語言實現神經網絡(1)

#R語言實現神經網絡 library(neuralnet) library(caret) library(MASS) library(vcd) data(shuttle) str(shuttle)#因變量use; table1<-structable(windmagn~use,shuttle) mosaic(table1,shadingT) mosaic(use~errorvis,shuttle) prop.table(table(shuttle$use,shuttle$stab…

計算機網絡-物理層(二)- 傳輸方式

計算機網絡-物理層&#xff08;二&#xff09;- 傳輸方式 串型傳輸與并行傳輸 串行傳輸:是指數據是一個比特一個比特依次發送的&#xff0c;因此在發送端和接收端之間&#xff0c;只需要一條數據傳輸線路即可 并行傳輸:是指一次發送n個比特而不是一個比特&#xff0c;因此發送…

【Uniapp】base64圖片資源轉為本地圖片,解決canvas不支持base64問題

通過接口獲取到base64類型的二維碼&#xff0c;把二維碼放到canvas里生成海報 遇到的問題&#xff1a; 在微信小程序開發工具中能夠正常顯示海報&#xff0c;到真機上測試就無法顯示二維碼 原因&#xff1a; 因為canvas不支持base64&#xff0c;其次在使用小程序 canvas 的 dr…

異常堆棧缺失與OmitStackTraceInFastThrow

目錄 現象原因OmitStackTraceInFastThrow源碼層面分析OmitStackTraceInFastThrow閾值是多少源碼源代碼解釋 現象 異常沒有堆棧信息。只有短短的異常類信息&#xff0c;例如java.lang.NullPointerException。 完整的異常堆棧示例&#xff1a; java.lang.NullPointerException…

爬蟲逆向實戰(十六)--某建筑市場平臺

一、數據接口分析 主頁地址&#xff1a;某建筑市場平臺 1、抓包 通過抓包可以發現數據接口是list 2、判斷是否有加密參數 請求參數是否加密&#xff1f; 無請求頭是否加密&#xff1f; 無響應是否加密&#xff1f; 通過查看“響應”模塊可以發現&#xff0c;返回的響應是…

MAUI+Blazor:windows 打包踩坑

文章目錄 前言MSIX安裝文件如何發布選擇Windows平臺旁加載自定義簽名版本號安裝 總結 前言 最近打算研究一下MAUIBlazor&#xff0c;爭取在今年年底之前徹底搞懂MAUIBlazor的安裝模式&#xff0c; MSIX安裝文件 Windows 4種安裝程序格式MSI&#xff0c;EXE、AppX和MSIX優缺點…

Java常用API---快速達到Java工作水準系列(1)

目錄 1.集合 2.包裝類 3.日期處理以及格式化 4.字符串處理類 5.數組 5.BigDecimal 6.Math 1.集合 毋庸置疑&#xff0c;集合在實際項目的使用概率幾乎是百分之百。無論是用于數據存儲和管理、去重和查找亦或是數據檢索和遍歷&#xff0c;都離不開集合的使用。任何一個項…

Spring Cloud Gateway系例—參數配置(CORS 配置、SSL、元數據)

一、CORS 配置 你可以配置網關來控制全局或每個路由的 CORS 行為。兩者都提供同樣的可能性。 1. Global CORS 配置 “global” CORS配置是對 Spring Framework CorsConfiguration 的URL模式的映射。下面的例子配置了 CORS。 Example 77. application.yml spring:cloud:gat…

【【STM32----I2C通信協議】】

STM32----I2C通信協議 我們會發現I2C有兩根通信線&#xff1a; SCL和SDA 同步 半雙工 帶數據應答 支持總線掛載多設備&#xff08;一主多從&#xff0c;多主多從&#xff09; 硬件電路 所有I2C設備的SCL連在一起&#xff0c;SDA連在一起 設備的SCL和SDA均要配置成開漏輸出模式 …

5.Vue_Element

文章目錄 1 Ajax1.1 Ajax介紹1.1.1 Ajax概述1.1.2 Ajax作用1.1.3 同步異步 1.2 Axios1.2.1 Axios的基本使用1.2.2 Axios請求方法的別名 2 前端工程化2.1 前端工程化特點2.2 Vue項目開發流程 3 Vue組件庫Element3.1 Element介紹 1 Ajax 1.1 Ajax介紹 1.1.1 Ajax概述 Ajax: 全…

【Unity游戲開發】基于前綴樹的紅點系統構思與客戶端方案

一、前言 前段時間負責了項目中紅點系統的實現,和大家分享一下初期是設計思路 紅點系統客戶端業務的一般實現過程與方式: 數據管理:首先要在客戶端建立一個數據管理系統,用于存儲和管理各個業務模塊的紅點狀態。可以是一個中央數據管理器或模塊化的數據管理系統,具體根據游…

VUE中babel.config.js配置按需引入

VUE中babel.config.js配置 vue/cli-plugin-babel/preset是一款 babel 插件&#xff0c;它會在編譯過程中將 import 引入自動轉換為按需引入的方式。 module.exports {presets: [vue/cli-plugin-babel/preset],plugins: [[import, {libraryName: element-ui,libraryDirectory…

系統架構設計師---多媒體技術及其應用

概念 媒體:承載信息的載體。 多媒體:數字、文字、聲音、圖形、圖像和動畫等各種媒體的有機組合,并與先進的計 算機、通信和廣播電視技術相結合,形成一個可組織、存儲、操縱和控制多媒體信息的集成環境和 交互系統。 多媒體技術:以數字化為基礎,能夠對多…

召集令:CloudQuery 社區有獎征文活動來啦!

CloudQuery 社區第一期征文活動來襲&#xff01;&#xff01;&#xff01;只要你對 CloudQuery 產品感興趣&#xff0c;或者是希望了解 CQ &#xff0c;都可以來參加&#xff0c;在本期活動中&#xff0c;我們也為大家準備了多種主題供你選擇&#xff0c;CQ 使用案例、版本對比…

udp與can通信的選擇與比較

UDP&#xff08;用戶數據報協議&#xff09;和CAN&#xff08;控制器局域網&#xff09;是兩種不同的通信協議&#xff0c;它們在實時傳遞性上有一些區別。 UDP是一種無連接的傳輸協議&#xff0c;它提供了簡單的、不可靠的數據傳輸。UDP不提供可靠性保證、流控制或重傳機制。…

EMO實戰:使用EMO實現圖像分類任務(一)

文章目錄 摘要安裝包安裝timm安裝 grad-cam安裝einops 數據增強Cutout和MixupEMA項目結構計算mean和std生成數據集 摘要 論文翻譯&#xff1a;https://blog.csdn.net/m0_47867638/article/details/132034098?spm1001.2014.3001.5501 官方源碼&#xff1a;https://github.com/…

shell的兩種屬性: 交互(interactive)與登錄(login)

1. 背景 在看shell變量的時候引起了興趣: 局部變量&#xff0c;全局變量&#xff0c;環境變量&#xff0c;shell的配置文件&#xff0c;參考博客: http://c.biancheng.net/view/773.html 2. 交互式與非交互式 參考博客: shell的兩個屬性:是否交互式(interactive), 是否登錄…