string類的寫時拷貝,不同方案分析。
在使用string類時使用淺拷貝會產生一塊空間析構多次的問題,所以產生了深拷貝,每次對物件進行值和空間同時拷貝,但這樣會使用更多的空間。為了避免產生更多的空間,引入寫時拷貝,當對空間進行更改時,檢查是否有除自己外別的物件使用這塊空間,若有,則自己重新開闢空間進行更改,不影響其他物件;若沒有其他物件使用此空間,則說明只有自己使用此空間,就進行更改。此時引入引用計數,用於統計有多少物件在使用此空間。
方案1:
如下圖所示:
當建立乙個物件s1,再拷貝構造乙個物件s2時,引用計數_refcount自動加1,此時為2。若此時s2要對自身進行修改,則s2重新開闢一塊空間,檢查引用計數_refcount是否大於1,若大於1,,則進行修改,這樣就不會影響其他物件。
s2重新開闢一塊兒空間,再修改s1原來空間的引用計數_refcount,使其減1,重新開闢的空間中因為此時只有s2乙個物件,所以引用計數_refcount也為1.
小結:此方案的寫時拷貝計數是同時開闢兩塊空間,乙個自身存放的內容,乙個存放引用計數_refcount,同時管理兩塊空間,統計當前使用此空間的物件數,當要修改當前空間的時候,進行對引用計數的判斷,再決定是否開闢新的空間。
**如下:
class string
//拷貝建構函式
string(string& s)
string& operator=(const string& s)
return *this;
} void release() }
~string()
void copyonwrite() }
char& operator(size_t pos)
char operator(size_t pos) const
private:
char* _str;
int* _refcount;
};
方案2:方案1中是開闢了兩塊空間進行管理,方案2採用開闢一塊空間進行寫時拷貝的操作。
開闢一塊空間,在這塊空間的頭4個位元組中放置引用計數,真正存放內容的空間從第5個位元組開始。一次性多開闢4個位元組進行寫時拷貝的操作。
具體如下圖所示:
當進行操作時,先檢查引用計數的個數,然後進行判斷是否開闢新的空間,同時修改引用計數的值,防止空間不能釋放。
具體例子如下:
當建立了3個物件,s1,s2,s3同時指向乙個空間,此時引用計數為3,再建立1個物件s4,s4的引用計數為1。
再進行操作s3 = s4;此時對應的引用計數和物件的指向都需要更改,更改之後如下圖所示:
物件s3指向了s4,同時s3原來的空間的引用計數進行減1,新指向空間的引用計數進行加1.
小結:方案2的寫時拷貝計數使用一塊空間進行內容和引用計數的管理和操作,不開闢兩塊空間,方便管理。
**如下:
class string
string(const string& s)
:_str(s._str)
~string() }
string& operator=(const string& s)
_str = s._str;
getrefcount()++;
} return *this;
} int& getrefcount()
char& operator(size_t pos)
void copyonwrite() }
private:
char* _str;
int* _refcount;
};
以上是本人對兩種不同方案寫時拷貝的簡單理解,希望看過的朋友可以提些改進的意見。 c 寫時拷貝
在c 中乙個類有六個預設成員函式,其中拷貝建構函式分為淺拷貝和深拷貝 淺拷貝是一種值拷貝,深拷貝不僅是值拷貝,還要做其他處理 深淺拷貝的區別 由上圖可知當乙個拷貝構造乙個需動態開闢空間的物件時,用淺拷貝時會出現同一塊空間被釋放兩次,這樣顯然有問題,用深拷貝的話可以解決此問題,但當拷貝構造出來的物件,...
寫時拷貝方案分析 copy on write
class string1 string1 string1 s str s.str refcount s.refcount string1 string1 operator string1 s private char str int refcount 用這種方法進行寫時拷貝,對乙個物件進行析構 r...
c 寫時拷貝1
class string string const string s ptr new char strlen s.ptr 1 另外開闢空間 string private char ptr void test int end gettickcount 記錄此時毫秒數 string const stri...