隱性資料的共享
Qt 中許多 C++ 類使用了隱式資料共享技術,來最大化資源利用率和最小化拷貝時的資源消耗。當作為引數傳遞時,具有隱式資料共享的類即安全又高效。在資料傳遞時,實際上只是傳遞了資料的指標(這一切都是隱含幫你完成的),而只有在函式發生需要寫入的情況時,資料才會被拷貝(也就是通常所說的寫時複製)。本章我們將介紹有關隱式資料共享的相關內容,以便為恰當地使用前面所介紹的容器夯實基礎。
具有資料共享能力的類包含了一個指向共享資料塊的指標。這個資料塊包含了資料本身以及資料的引用計數。當共享物件建立出來時,引用計數被設定為 1。當新的物件引用到共享資料時,引用計數增加;當物件引用不再引用資料時,引用計數減少。當引用計數變為 0 時,共享資料被刪除。
在我們操作共享資料時,實際有兩種拷貝物件的方法:我們通常稱其為深拷貝和淺拷貝。深拷貝意味著要重新構造一個全新的物件;淺拷貝則僅僅複製引用,也就是上面所說的那個指向共享資料塊的指標。深拷貝對記憶體和 CPU 資源都是很昂貴的;淺拷貝則非常快速,因為它僅僅是設定一個新的指標,然後將引用計數加 1。具有隱式資料共享的物件,其賦值運算子使用的是淺拷貝來實現的。
這種隱式資料共享的好處是,程式不需要擁有不必要的重複資料,減少資料拷貝的需求。重複資料的代價是降低記憶體使用率(因為記憶體儲存了更多重複的資料)。通過資料共享,物件可以更簡單地作為值來傳遞以及從函式中返回。
隱式資料共享是在底層自動完成的,程式人員無需關心。這也是“隱式”一詞的含義。從 Qt4 開始,即使在多執行緒程式中,隱式資料共享也是起作用的。在很多人看來,隱式資料共享和多執行緒是不相容的,這是由引用計數的實現方式決定的。但是,Qt 使用了原子性的引用計數來避免多執行緒環境下可能出現的執行順序打斷的行為。需要注意的是,原子引用計數並不能保證執行緒安全,還是需要恰當的鎖機制。這種觀點對所有類似的場合都是適用的。原子引用計數能夠保證的是,執行緒肯定操作自己的資料,執行緒自己的資料是安全的。總的來說,從 Qt4 開始,你可以放心使用隱式資料共享的類,即使在多執行緒環境下。
我們可以使用QSharedData
和QSharedDataPointer
類實現自己的隱式資料共享類。
當物件即將被修改,並且其引用計數大於 1 時,隱式資料共享自動將資料從共享塊中拿出。隱式共享類必須控制其內部資料,在任何修改其資料的函式中,將資料自動取出。
相關文章
- 資料洩露的隱性成本
- 隱私計算助力資料的安全流通與共享
- Fluid 給資料彈性一雙隱形的翅膀 -- 自定義彈性伸縮UI
- WebService共享資料的使用Web
- 資料隱私不僅僅是指機密性
- Sessionstorage 資料共享Session
- 微服務中的資料共享微服務
- 同一份資料全域共享,HashData UnionStore實時性背後的故事
- Flutter 資料共享 InheritedWidgetFlutter
- 隱私計算:保護資料隱私的利器
- Netweaver和Windows,Ubuntu的資料共享WindowsUbuntu
- 隱藏的資料夾怎麼找出來 恢復隱藏資料夾的辦法
- laravel 檢視資料共享Laravel
- 【SpringMVC】域物件共享資料SpringMVC物件
- fragment之間相互傳資料、共享資料Fragment
- win10如何設定共享資料夾 win10設定共享資料夾的方法Win10
- 微信小程式--資料共享與方法共享微信小程式
- 淺談Redis的隱性成本Redis
- 開啟VirtualBox的雙向共享資料夾,共享貼上板,拖放
- 資料隱藏技術資料隱藏
- win 建立共享資料夾(共享需要密碼,共享後打不開)密碼
- 資料庫 資料庫的完整性資料庫
- 資料庫中的共享鎖與排他鎖資料庫
- 隱藏資料夾怎麼取消隱藏 關閉隱藏檔案的辦法
- Laravel前後臺共享資料Laravel
- Vuex如何實現資料共享Vue
- win10資料夾如何隱藏_win10系統的資料夾怎麼隱藏Win10
- win10隱藏的資料夾怎麼找出來 顯示隱藏資料夾步驟Win10
- 企業雲盤 資料資產管理與資料共享
- 關於資料隱私的文化轉變
- node_modules 資料夾下 .bin 隱藏資料夾的作用
- win10 如何顯示隱藏資料夾_win10 如何顯示隱藏的資料夾Win10
- win10如何顯示隱藏資料夾 win10開啟隱藏資料夾的方法Win10
- QT 智慧指標 QPointer QScopedPointer QSharedPointer QWeakPointer QSharedDataPointer 隱式共享 顯示共享QT指標
- 電腦共享資料夾怎麼設定 電腦共享文件的辦法
- 1.05 docker的持久化儲存和資料共享Docker持久化
- Docker的持久化儲存和資料共享(四)Docker持久化
- Python 多程式的自定義共享資料型別Python資料型別
- 資料共享交換平臺的實踐分享