内存共享和Copy-On-Write技术

来源:互联网 发布:linux 断开ln 编辑:程序博客网 时间:2024/04/29 23:18

刚看到一篇文章《 标准C++类std::string的内存共享和Copy-On-Write技术》,觉得很有意思,于是将个人的理解记录于此。

该文章的出处为:http://blog.csdn.net/haoel/archive/2004/06/23/24058.aspx

 

1.Copy-On-Write技术

   Copy-On-Write技术使用了“引用计数”。当第一个类构造时,string的构造函数会根据传入的参数从堆上分配内存,当有其它类需要这块内存时,这个计数为自动累加,当有类析构时,这个计数会减一,直到最后一个类析构时,此时的引用计数1或是0,此时,程序才会真正的Free这块从堆上分配的内存。

  所以,引用计数就是string类中写时才拷贝的原理。

  由于string类的内存是在堆上动态分配的,所以既然共享内存的各个类指向的是同一个内存区,我们为什么不在这块区上多分配一点空间来存放这个引用计数呢?这样一来,所有共享一块内存区的类都有同样的一个引用计数,而这个变量的地址既然是在共享区上的,那么所有共享这块内存的类都可以访问到,也就知道这块内存的引用者有多少了。

  于是,有了这样一个机制,每当我们为string分配内存时,我们总是要多分配一个空间用来存放这个引用计数的值,只要发生拷贝构造可是赋值时,这个内存的值就会加一。而在内容修改时,string类为查看这个引用计数是否为0,如果不为零,表示有人在共享这块内存,那么自己需要先做一份拷贝,然后把引用计数减去一,再把数据拷贝过来。

 

2.内存共享

   在string类中,内存共享就是指多个string对象使用同一块内存,直到某一个string对象的内容发生改变时才为其分配内存。

 

3.这个两种技术的一个简单实现

   下面是我实现的一个非常简单的string类MyString:

   该类仅实现了:

   a. MyString str1("good");//定义一个string对象

       MyString str2;

   b. MyString str3(str1);//拷贝构造

   c. MyString str4;

       str4 = str3;//对象赋值操作符

   d. str4[0] = ''w;//[]操作符

   e.  str4.my_c_str();//获取C串

   f. str4.my_size();//获取其大小

 

mystring.h

 

mystring.cpp

4. 测试代码如下: