写时拷贝

来源:互联网 发布:科学引文索引数据库 编辑:程序博客网 时间: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 住友39熔接机熔接损耗大怎么办 支付宝实名认证刷脸失败怎么办 支付宝注册刷脸不是本人怎么办 小学科学只考88分中学怎么办 收银机关机时才上传数据是怎么办 刚做的系统玩cf卡屏怎么办 办健康证的资料掉了怎么办 刚刚办得的健康证掉了怎么办 房子都过户了银行贷不了款怎么办 我要办大病迁出应该怎么办啊? 遗产继承后户口没地迁出怎么办 安徽蒙城怎么办去韩国的签证的 夜间有人私自收停车费应该怎么办 上次摸不到环尾丝这次摸到了怎么办 法院判决书下来后对方不给钱怎么办 法院判决书下来了钱还保全么怎么办 深圳路边泊车不知道泊车编号怎么办 当事人进拘留所了我的工资怎么办 昆明公租房住满5年后怎么办 昆明公租房房子到期缴纳金怎么办 看守所犯人银行卡里钱没用完怎么办 中国邮政迟迟没有把信件寄到怎么办 拘留15天放出来还不肯还钱怎么办 人死在拘留所不让看监控怎么办 家人吸毒可他又不愿强戒怎么办 容留他人吸毒时签了强戒怎么办 拘留后发现被拘留是人大代表怎么办 执行局要拘留人找不到人怎么办 开设赌场罪拘留37天了该怎么办 对治安处罚光罚款不拘留怎么办 打架和解后警察不给消案怎么办 12个人片诈骗刑拘了28天怎么办 交警拘留几天后还是没钱赔偿怎么办 平安车主信用卡车牌号填错了怎么办 起诉借钱的人逮起来了怎么办 在法院查不到坐牢人的档案怎么办 人被冤枉敲诈勒索进看守所了怎么办 打架被拘留孩子怎么办三周了 技师被拘留她的家人该怎么办 我是担保人贷款人跑了我该怎么办 公司依旷工理由辞退我该怎么办