内存共享和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. 测试代码如下:
- 内存共享和Copy-On-Write技术
- std::string的内存共享和Copy-On-Write技术
- 【转】string的内存共享和Copy-On-Write技术
- std string的内存共享和Copy-On-Write技术
- std::string的内存共享和Copy-On-Write技术
- std::string的共享内存和Copy-On-Write技术
- std string的内存共享和Copy-On-Write技术
- 标准C++类std::string的内存共享和Copy-On-Write技术
- 标准C++类std::string的内存共享和Copy-On-Write技术
- 标准C++类std::string的内存共享和Copy-On-Write技术
- 标准C++类std::string的内存共享和Copy-On-Write技术
- 标准C++类std::string的内存共享和Copy-On-Write技术(1)
- 标准C++类std::string的内存共享和Copy-On-Write技术
- 标准C++类std::string的内存共享和copy-on-write技术
- 标准C++类std::string的内存共享和Copy-On-Write技术
- 标准C++类std::string的内存共享和Copy-On-Write技术(转)
- 标准C++类std::string的内存共享和Copy-On-Write技术
- 标准C++类std::string的 内存共享和Copy-On-Write技术
- 97 Things Every Programmer Should Know
- j2me 内存优化
- 开发者证书申请方法
- C#界面皮肤的三种加载方法
- 测试方法
- 内存共享和Copy-On-Write技术
- c#中抽象类和接口的区别
- 一些Web编辑器
- 50个网页常用小代码
- 关于Android
- Autocompleter
- linq to sql要注意的及存储过程多结果集实现
- merge
- 人生阶段的划分