Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260169
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2015-12-13 19:22:56

COW:Copy on wirte
所谓写时拷贝,就是在需要改写字符串的时候才会去开辟空间,写入新的字符串。要是不改写,就只是单纯的创建一个指针,指向原有的字符串。此字符串头部放入指向它的指针个数,以便知道何时需要delete。以“拖延战术”来提高效率。

点击(此处)折叠或打开

  1. #include<iostream>
  2. #include<windows.h>
  3. using namespace std;
  4. class String
  5. {
  6. public:
  7.     String(const char *str)
  8.         :_str(new char[strlen(str) + 5])
  9.     {
  10.         _str += 4;
  11.         GetRefCount(_str) = 1;
  12.         strcpy(_str,str);
  13.     }
  14.     String(const String &s)
  15.         :_str(s._str)
  16.     {
  17.         ++GetRefCount(_str);
  18.     }
  19.     String operator=(const String&s)
  20.     {
  21.         if(_str != s._str)
  22.         {
  23.             Release(_str);
  24.             _str = s._str;
  25.             ++GetRefCount(_str);
  26.         }
  27.         return *this;
  28.     }
  29.     ~String()
  30.     {
  31.         Release(_str);
  32.     }
  33.     char&operator[](size_t pos)
  34.     {
  35.         if(--GetRefCount(_str) != 0)
  36.         {
  37.             char *tmp = new char[strlen(_str) + 5];    
  38.             --GetRefCount(_str);
  39.             tmp += 4;
  40.             strcpy(tmp,_str);
  41.             _str = tmp;
  42.             tmp = NULL;
  43.             GetRefCount(_str) = 1;
  44.         }
  45.         return _str[pos];
  46.     }
  47. private:
  48.     void Release(char *p)
  49.     {
  50.         if(--GetRefCount(_str) == 0)
  51.         {
  52.             delete [] (p - 4);
  53.         }
  54.     }
  55.     int& GetRefCount(char *p)
  56.     {
  57.         return *(int *)(p - 4);
  58.     }
  59.     char *_str;
  60. };
  61. void Test1()
  62. {
  63.     String s1("111111111111111111111");
  64.     String s2(s1);

  65.     String s3("222222222222222222222");
  66.     s1 =s1;
  67. }
  68. void Test2()
  69. {
  70.     String s1("111111111111111111111");
  71.     cout<<s1[3]<<endl;
  72. }
  73. int main()
  74. {
  75.     //Test1();
  76.     Test2();
  77.     system("pause");
  78.     return 0;
  79. }
为了防止使用者在读取时顺便修改,其中符号[]为读时也拷贝.
此种方法会牵扯到线程不安全,在最新的String库中已被取消。
阅读(1539) | 评论(0) | 转发(0) |
0

上一篇:String类

下一篇:珍惜

给主人留下些什么吧!~~