之前分享了模拟实现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;
}
这样呢,就会比传统写法和现代写法都高效很多。