关闭

写时拷贝

标签: Copy On WriteCOWstring
587人阅读 评论(0) 收藏 举报
分类:
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;                       //引用计数的初始值设置成1
		strcpy(_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
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

STL——STL中string的写时拷贝机制

STL中string的写时拷贝机制
  • Linux_ever
  • Linux_ever
  • 2016-03-25 20:53
  • 480

深入探究fork函数写时拷贝技术的实现

这几天在看《Linux内核设计与实现》,看到fork函数写时拷贝(copy on write)那一节,突然发现以前学习写时拷贝技术的时候只是大概理解了它的原理,并没有深入理解,本来想在网上找找有没有分析写时拷贝技术实现原理的博客,找了半天发现全是些介绍理论的,balabala一大堆,于是决定自己去看...
  • woshijidutu
  • woshijidutu
  • 2017-03-25 21:03
  • 630

写时拷贝技术:Copy-On-Write

写时拷贝技术 1、概念 Scott Meyers在《More Effective C++》中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的 样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母...
  • yangshuangtao
  • yangshuangtao
  • 2016-05-25 10:46
  • 4008

由深拷贝与浅拷贝引发的引用计数、写时拷贝技术

一、理解深拷贝和浅拷贝: #include using namespace std; class String { public: String(const char *str = "") { if(str == NULL) { data = new cha...
  • wjxxaut
  • wjxxaut
  • 2016-08-13 21:14
  • 320

写时拷贝(copy-on-write) COW技术

写时拷贝(copy-on-write) COW技术
  • u012333003
  • u012333003
  • 2014-05-06 17:52
  • 2083

Linux之写时复制技术

 写入时复制(Copy-on-write)是一个被使用在程式设计领域的最佳化策略。其基础的观念是,如果有多个呼叫者(callers)同时要求相同资源,他们会共同取得相同的指标指向相同的资源,直到某个呼叫者(caller)尝试修改资源时,系统才会真正复制一个副本(private copy...
  • qq_32744005
  • qq_32744005
  • 2016-08-21 16:44
  • 398

从win32中的写时复制(Copy on write )机制谈起

我们知道,内存映射文件的物理存储器来自
  • bobopeng
  • bobopeng
  • 2014-07-24 00:11
  • 1000

写时拷贝技术(copy-on-write)

传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃。Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至...
  • chinabhlt
  • chinabhlt
  • 2015-12-16 11:03
  • 1707

深浅拷贝与写时拷贝

在c++中,基本所有的类都要考虑深拷贝,浅拷贝与写时拷贝,根据不同的定义,选择适合自己的拷贝方式。时间类就可以用浅拷贝,而二叉树,string类就需要深拷贝。 string类在vs编译器下使用的深拷贝,在Linux下使用的浅拷贝。 为什么会存在深浅拷贝的问题呢? string的浅拷贝是让...
  • errors5835
  • errors5835
  • 2017-07-13 13:57
  • 86

深浅拷贝和写时拷贝

拷贝:        事实是,在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。 浅拷贝: ...
  • poison_biti
  • poison_biti
  • 2017-07-25 22:07
  • 305
    博客专栏
    文章分类
    最新评论