為了最大化資源使用,和最小化資料拷貝,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...