C C 寫時拷貝

2021-07-29 14:18:27 字數 1657 閱讀 4101

何為寫時拷貝? 前面我說過深拷貝淺拷貝,今天我們來**一下寫時拷貝。

深拷貝是補充了淺

拷貝的不足,寫時拷貝其實也

就是補充一點深拷貝的不

足。其實寫時拷貝的意思就是: 當你讀

取到這個空間的時候,並不會開闢出乙個一

模一樣的空間出

來給你,當你真正需要拷貝的時候,那

麼他就會開闢出空間

給你。也就是拖延版的深拷貝。

寫時拷貝技術是通過"引用計數"實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標

指向塊空間,當有新的指

針指向這塊空間時,引用

計數加一,當要釋放這塊空間時,引用計數減一

(假裝釋放),直到引用計數減為0時才真的釋放掉這

塊空間。當有的指標要改變這塊空間的值時,再

為這個指標分配自己的空間(注意這時引用計數的變化,舊的空間的引用計數

減一,新分配的空間引

用計數加一)。

寫時拷貝的實用:實現乙個string類

class string  

string(string& s)

:_str(s._str)

string& operator=(string& s)

return *this;

} ~string()

public:

char& operator(size_t index)

getcount()--;

char *tmp = _str;

_str = new char[strlen(tmp) + 1 + 4];

_str += 4;

strcpy(_str, tmp);

getcount() = 1;

return _str[index];

} private:

int& getcount()

void release()

} private:

char *_str;

};

這裡有乙個問題呢~,c++標準的確就是這樣的,c++標準認為,當你通過迭代器或獲取到string的內部

位址的時候,string

並不知道你將是要讀還是

要寫。這是它無法確定,為此,當你獲取到內部引用後,為

了避免不能捕獲你的寫操作,它在此時廢

止了寫時才拷貝技術。

這樣看來我們在使用寫時拷貝的時候,一定要注意,如果你不需要對string的內部進行修改,那你就千

萬 不要使

用通過操作符和迭代器去獲取字串

的內部位址引用,如果你一定要這麼做,那麼你就必須要付

出代價。

當然,

string還提供了一些使迭代器和引用失效的方法。比如說push_back,等, 

你在使用之

後再使用

迭代器之後,引用就有可能失效了。

這個部落格有部分借鑑了我的學長~ 

c 寫時拷貝

在c 中乙個類有六個預設成員函式,其中拷貝建構函式分為淺拷貝和深拷貝 淺拷貝是一種值拷貝,深拷貝不僅是值拷貝,還要做其他處理 深淺拷貝的區別 由上圖可知當乙個拷貝構造乙個需動態開闢空間的物件時,用淺拷貝時會出現同一塊空間被釋放兩次,這樣顯然有問題,用深拷貝的話可以解決此問題,但當拷貝構造出來的物件,...

寫時拷貝技術

cow技術初窺 在linux程式中,fork 會產生乙個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了 寫時複製 技術,也就是只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。那麼子程序的物理空間沒有 怎麼去取指令執行exec系...

寫時拷貝技術

寫時拷貝故名思意 是在寫的時候 即改變字串的時候 才會真正的開闢空間拷貝 深拷貝 如果只是對資料的讀時,只會對資料進行淺拷貝 寫時拷貝技術是通過 引用計數 實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數...