何為寫時拷貝? 前面我說過深拷貝淺拷貝,今天我們來**一下寫時拷貝。
深拷貝是補充了淺
拷貝的不足,寫時拷貝其實也
就是補充一點深拷貝的不
足。其實寫時拷貝的意思就是: 當你讀
取到這個空間的時候,並不會開闢出乙個一
模一樣的空間出
來給你,當你真正需要拷貝的時候,那
麼他就會開闢出空間
給你。也就是拖延版的深拷貝。
寫時拷貝技術是通過"引用計數"實現的,在分配空間的時候多分配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個位元組,用來記錄有多少個指標指向塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數...