Qt之美(三) 隱式共享

2021-06-18 23:19:31 字數 1439 閱讀 6763

為了最大化資源使用,和最小化資料拷貝,qt在很多類中用到了隱式資料共享,以便資料僅在被寫入時才被拷貝。該機制也被稱為flyweight模式。

讓我們以qbytearray為例,看看其是如何實現的。其內部使用乙個名為data的私有結構體來追蹤共享的資料:

[cpp]view plain

copy

struct

data ;  

這裡,如果資料儲存在其他位置,則需要用到data來指向實際的資料位置;如果儲存在自身,則是array指向的位置。當物件被拷貝時(比如通過賦值運算子),則僅僅拷貝指標,而不拷貝資料本身:

[cpp]view plain

copy

qbytearray &qbytearray::operator=(

const

qbytearray & other)  

另一方面,如果共享的資料要被修改(比如通過resize()函式),則會自動拷貝之:

[cpp]view plain

copy

void

qbytearray::resize(

intsize)  

else

if(d == &shared_null)  else

}  }  }  

現在讓我們來看看如何使用qshareddata和qshareddatapointer來建立自己的共享資料物件

[cpp]view plain

copy

// 首先建立乙個資料物件,需要繼承自qsharedata,因為其提供了引用計數器的功能

class

shareddata: 

public

qshareddata  

shareddata(const

shareddata &other)  

: qshareddata(other)  

, var(other.var)  

{}  

intvar;  

};  

// 然後建立資料操作者

class

dataowner  

dataowner(int

var)  

: d(new

shareddata)  

private

:  // 模板類qshareddatapointer隱藏了隱式共享的實現細節,因此沒必要建立拷貝建構函式和賦值運算子

qshareddatapointerd;  

};  

相當簡單,沒錯吧!好了,有興趣的朋友可以用qexplicitlyshareddatapointer來建立顯式的資料共享;)

Qt學習05 隱式共享

隱式共享又稱回寫複製 copy on write 當兩個物件共享同乙份資料時,如果資料不改變,則進行淺拷貝。當某個物件改變資料時,則進行深拷貝。深拷貝和淺拷貝是程式在處理共享物件時的兩種複製方式。深拷貝是生成乙個物件的完整複製品,而淺拷貝只進行引用複製,如複製指向共享資料的指標。由於深拷貝複製乙個完...

Qt 資料的隱式共享

在qt中有很多隱式共享類 implicitly shared classes 什麼是隱式共享呢,請參考官方文件的說明。好吧,翻譯一下 許多c 類隱式地共享資料,使得資源使用最大化,以及物件拷貝最小化。隱式共享類在傳參時既安全又高效,因為只傳了乙個指向資料的指標,並且只有給它寫入時資料才會被拷貝。看了...

Qt 注意隱式共享機制

最佳實踐 隱式共享對stl樣式的迭代器有另乙個影響 當迭代器在該容器上處於活動狀態時,應避免複製容器。迭代器指向內部結構 不要在使用了隱式資料共享的容器上,在有非 const stl 風格的遍歷器正在遍歷時複製容器 qvectorm vec vec m vec 0 100 qdebug vec ve...