COW:Copy on wirte
所谓写时拷贝,就是在需要改写字符串的时候才会去开辟空间,写入新的字符串。要是不改写,就只是单纯的创建一个指针,指向原有的字符串。此字符串头部放入指向它的指针个数,以便知道何时需要delete。以“拖延战术”来提高效率。
-
#include<iostream>
-
#include<windows.h>
-
using namespace std;
-
class String
-
{
-
public:
-
String(const char *str)
-
:_str(new char[strlen(str) + 5])
-
{
-
_str += 4;
-
GetRefCount(_str) = 1;
-
strcpy(_str,str);
-
}
-
String(const String &s)
-
:_str(s._str)
-
{
-
++GetRefCount(_str);
-
}
-
String operator=(const String&s)
-
{
-
if(_str != s._str)
-
{
-
Release(_str);
-
_str = s._str;
-
++GetRefCount(_str);
-
}
-
return *this;
-
}
-
~String()
-
{
-
Release(_str);
-
}
-
char&operator[](size_t pos)
-
{
-
if(--GetRefCount(_str) != 0)
-
{
-
char *tmp = new char[strlen(_str) + 5];
-
--GetRefCount(_str);
-
tmp += 4;
-
strcpy(tmp,_str);
-
_str = tmp;
-
tmp = NULL;
-
GetRefCount(_str) = 1;
-
}
-
return _str[pos];
-
}
-
private:
-
void Release(char *p)
-
{
-
if(--GetRefCount(_str) == 0)
-
{
-
delete [] (p - 4);
-
}
-
}
-
int& GetRefCount(char *p)
-
{
-
return *(int *)(p - 4);
-
}
-
char *_str;
-
};
-
void Test1()
-
{
-
String s1("111111111111111111111");
-
String s2(s1);
-
-
String s3("222222222222222222222");
-
s1 =s1;
-
}
-
void Test2()
-
{
-
String s1("111111111111111111111");
-
cout<<s1[3]<<endl;
-
}
-
int main()
-
{
-
//Test1();
-
Test2();
-
system("pause");
-
return 0;
-
}
为了防止使用者在读取时顺便修改,其中符号[]为读时也拷贝.
此种方法会牵扯到线程不安全,在最新的String库中已被取消。
阅读(1581) | 评论(0) | 转发(0) |