之前分享了模擬實現String類的傳統寫法和現代寫法,今天再來分享一下寫時拷貝的方法,寫時拷貝主要用在一下場景中
需要大量拷貝構造,析構同樣的空間,這樣,傳統寫法和現代寫法中國不斷的開闢空間,析構空間,效率太低
<span style="font-size:14px;">void Test()
{
String s1("s1");
for (int i = 0; i < 1000; i++)
{
String s2(s1);
}
}</span>
寫時拷貝就是增加一個成員變量,開闢一塊空間,專門用來存放指向這塊空間的指針個數,析構一次就把存放個數的空間裏的值減一,直至減爲0才析構釋放這塊空間。
代碼實現:
//寫時拷貝--->count 引用計數
class String
{
public:
String(char* str = " ")
:_str(new char[strlen(str)+1])
, _pRefCount(new int(1))
{
strcpy(_str, str);
}
String(String& s)
:_str(s._str)
,_pRefCount(s._pRefCount)
{
++*_pRefCount;
}
String operator=(const String& s)
{
if (this != &s)
{
char* tmp = new char[strlen(s._str) + 1];
strcpy(tmp, s._str);
delete[] _str;
_str = tmp;
}
return *this;
}
~String()
{
if (--(*_pRefCount) == 0)
{
cout << "~String()" << endl;
delete[] _str;
delete _pRefCount;
}
}
private:
char* _str;
int* _pRefCount;
};
void Test1()
{
String s1("s1");
String s2(s1);
String s3(s2);
String s4("s4");
String s5(s4);
}
int main()
{
Test1();
system("pause");
return 0;
}
這樣呢,就會比傳統寫法和現代寫法都高效很多。