C 寫時拷貝的不同方案(String類)

2021-08-04 05:59:51 字數 2236 閱讀 8198

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...