Qt 注意隱式共享機制

2022-08-19 18:24:11 字數 789 閱讀 3081

最佳實踐:

隱式共享對stl樣式的迭代器有另乙個影響:當迭代器在該容器上處於活動狀態時,應避免複製容器。 迭代器指向內部結構

不要在使用了隱式資料共享的容器上,在有非 const stl 風格的遍歷器正在遍歷時複製容器

; qvectorm_vec = vec;

m_vec[0] = 100;

qdebug() << vec; // vec不變

qdebug() << m_vec; // m_vec變化

return a.exec();

}如果定義了乙個迭代器,修改了迭代器指向的值,而其中並沒有觸發copy on write 機制,這是非常奇怪的現象。避免出現這樣的用法

; auto ver_iter = vec.begin(); // notice!!!

qvectorm_vec = vec;

*ver_iter = 100; // m_vec中的資料也被修改了

qdebug() << vec;

qdebug() << m_vec;

return a.exec();

}但是修改**的順序後,又有不同的現象,這是很有迷惑性的。

; qvectorm_vec = vec;

auto ver_iter = vec.begin();

*ver_iter = 100; // 僅僅vec改變,m_vec沒有改變

qdebug() << vec;

qdebug() << m_vec;

return a.exec();

}參考文件:

Qt學習05 隱式共享

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

Qt 資料的隱式共享

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

Qt之美(三) 隱式共享

為了最大化資源使用,和最小化資料拷貝,qt在很多類中用到了隱式資料共享,以便資料僅在被寫入時才被拷貝。該機制也被稱為flyweight模式。讓我們以qbytearray為例,看看其是如何實現的。其內部使用乙個名為data的私有結構體來追蹤共享的資料 cpp view plain copy struc...