写时拷贝
来源:互联网 发布:科学引文索引数据库 编辑:程序博客网 时间:2024/06/06 09:36
Copy On Write(COW):写时拷贝技术
一、什么是写时拷贝技术:
写时拷贝技术可以理解为“写的时候才去分配空间”,这实际上是一种拖延战术。
举个栗子:
二、写时拷贝技术原理:
写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一(假装释放),直到引用计数减为0时才真的释放掉这块空间。当有的指针要改变这块空间的值时,再为这个指针分配自己的空间(注意这时引用计数的变化,旧的空间的引用计数减一,新分配的空间引用计数加一)。
三、利用写时拷贝技术实现简单string类:
class String{public:String(const char *str = ""):_str(new char[strlen(str) + 1 + 4]){cout << "Sring()" << endl;_str += 4; //前4个字节用来存放引用计数GetCount() = 1; //引用计数的初始值设置成1strcpy(_str, str);}String(String& s):_str(s._str){cout << "Sring(String&)" << endl;GetCount()++;}String& operator=(String& s){cout << "Sring& operator=" << endl;if (this != &s){Release();_str = s._str;GetCount()++;}return *this;}~String(){cout << "~Sring()" << endl;Release();}public:char& operator[](size_t index){if (GetCount() == 1) //如果计数器为1,则直接返回{return _str[index];}GetCount()--;char *tmp = _str;_str = new char[strlen(tmp) + 1 + 4];_str += 4;strcpy(_str, tmp);GetCount() = 1;return _str[index];}private:int& GetCount(){return *(int *)(_str - 4);}void Release(){if (--GetCount() == 0){cout << "释放" << endl;delete[](_str - 4); //注意释放的时候还有 存放引用计数的4个字节_str = NULL;}}private:char *_str;};
2 0
- 深拷贝&浅拷贝&写时拷贝
- 写时拷贝技术
- linux 写时拷贝
- fork写时拷贝
- 写时拷贝
- c++ 写时拷贝
- 写时拷贝
- C++ 写时拷贝
- 写时拷贝
- 写时拷贝
- C++ 写时拷贝
- 写时拷贝
- 写时拷贝
- C++写时拷贝
- 写时拷贝
- c++写时拷贝
- 写时拷贝
- 写时拷贝
- Java编程的动态性(author Dennis M. Sosnoski )学习——学习笔记(1)
- 一个简单的volley网络请求
- 如何在linux下查看目录的剩余空间大小
- 删除链表中的重复元素
- java基于spring框架上传文件
- 写时拷贝
- 都在做百度SEO,你是否真的了解百度?
- [转]【坐在马桶上看算法】算法2:邻居好说话:冒泡排序--作者:ahalei
- iOS-RAC学习笔记(二)——RACSignal订阅
- Spring框架介绍
- 反射の从Class建立对象
- 终于推开那扇门
- TPL——取消一个Task
- 微信公众平台jsapi开发教程(1)获取jsapi_ticket