寫時複製Copy On Write

2021-07-30 22:00:41 字數 1631 閱讀 6682

copy-on-write簡稱cow,不是奶牛,好處就是能保證資料的完整性,掉電的話容易恢復。

在執行複製和賦值的時候,不會真正的copy,只有真正對內容進行修改時,才會進行複製,複製完之後再去修改-->懶複製

•copy-on-write一定使用了「引用計數」,必然有乙個變數類似於refcnt

•當第乙個string物件str1構造時,string的建構函式會根據傳入的引數從堆上分配記憶體

•當有其它string物件複製str1時,這個refcnt會自動加1

•當有物件析構時,這個計數會減1;直到最後乙個物件析構時,refcnt為0,此時,程式才會真正的釋放這塊從堆上分配的記憶體

•在共享同一塊記憶體的類發生

內容改變時,才會發生copy-on-write •

•比如string類的 •

#include #include #include using std::cout;

using std::endl;

using std::string;

//std::string並不是執行緒安全的

int main(void)

執行後的結果為:

s1 = hello,world

s2 = hello,world

s3 = hello,world

p1 = 0x204f028

p2 = 0x204f028

p3 = 0x204f028

發生修改之後:

s1 = hello,world

s2 = hello,world

s3 = xello,world

p1 = 0x204f028

p2 = 0x204f028

p3 = 0x204f058

顯而易見,當修改其內容時,發生copy-on-write

#include #include #include using std::cout;

using std::endl;

using std::string;

//std::string並不是執行緒安全的

int main(void)

執行結果為:

s1 = hello,world

s2 = hello,world

s3 = hello,world

p1 = 0x211e028

p2 = 0x211e028

p3 = 0x211e028

發生修改之後:

s1 = hello,world

s2 = hello,world

s3 = xello,world

p1 = 0x211e028

p2 = 0x211e028

p3 = 0x211e058

讀取s2[0]之後

hs1 = hello,world

s2 = hello,world

s3 = xello,world

p1 = 0x211e028

p2 = 0x211e088

p3 = 0x211e058

Copy On Write寫時複製

copy on write解決的問題 早期unix系統建立程序的方式存在缺陷 當發出fork 系統呼叫時,核心原樣複製父程序的整個位址空間並把複製的那乙份分配給子程序。這種行為是非常耗時的,因為它需要 為子程序的頁表分配頁幀 為子程序的頁分配頁幀 初始化子程序的頁表 把父程序的頁複製到子程序相應的頁...

Copy On Write 寫時複製

維基百科 寫入時複製 copy on write 是乙個被使用在程式設計領域的最佳化策略。其基礎的觀念是,如果有多個呼叫者 callers 同時要求相同資源,他們會共同取得相同的指標指向相同的資源,直到某個呼叫者 caller 嘗試修改資源時,系統才會真正複製乙個副本 private copy 給該...

關於 copy on write 寫時複製

先舉個小例子,在我們學習c 的時候,我不相信老師沒跟你提過什麼是字串string淺拷貝深拷貝的問題,就是 string a i am a programer string b a 這是所謂的淺拷貝,當然我們不是在討論淺拷貝的問題,我只是讓大家知道b只是字串 i am a programer 的乙個引...