Copy_on_write的简单实现
Copy_on_write即写时复制,它的原理是通过引用计数来实现的.
即在分配空间时多分配额外的空间,用来记录有多少个指针指向该空间.当有新的指针指向该空间,引用计数则加一,当要释放该空间时,引用计数则减一,直到引用计数减为0时,才真正释放该空间.当有指针要改变该空间的值时,再为这个指针分配自己的空间.而我们说的引用计数,存在于堆内存中.
下面的代码将实现简单的写时复制功能,如有错误欢迎指正.
1 #include <string.h> 2 #include <iostream> 3 using std::cout; 4 using std::endl; 5 6 class String 7 { 8 public: 9 String() 10 : _pstr(new char[2]()) 11 { 12 initRefcnt(); 13 } 14 15 String(const char * pstr) 16 : _pstr(new char[strlen(pstr)+2]()) 17 { 18 strcpy(_pstr,pstr); 19 initRefcnt(); 20 } 21 22 String(const String &rhs) 23 : _pstr(rhs._pstr) 24 { 25 increaseRefcnt(); 26 } 27 28 String & operator=(const String & rhs) 29 { 30 if(this != &rhs) 31 { 32 decreaseRefcnt(); 33 if(getRefcnt()==0) 34 delete [] _pstr; 35 _pstr = rhs._pstr; 36 increaseRefcnt(); 37 } 38 return *this; 39 } 40 41 ~String() 42 { 43 decreaseRefcnt(); 44 if(getRefcnt()==0) 45 { 46 delete [] _pstr; 47 cout << "~String()" << endl; 48 } 49 } 50 51 size_t size() const 52 { 53 return strlen(_pstr); 54 } 55 56 const char * c_str() const 57 { 58 return _pstr; 59 } 60 61 size_t getRefcnt() const 62 { 63 return _pstr[size()+1]; 64 } 65 66 char & operator[](size_t idx) 67 { 68 static char nullchar = '\0'; 69 if(idx < size()) 70 { 71 if(getRefcnt()>1) 72 { 73 decreaseRefcnt(); 74 char * ptmp = new char[strlen(_pstr)+2]; 75 strcpy(ptmp,_pstr); 76 _pstr = ptmp; 77 initRefcnt(); 78 } 79 return _pstr[idx]; 80 } 81 else 82 { 83 cout << "Oops-->index cruptted!" << endl; 84 return nullchar; 85 } 86 } 87 88 private: 89 void initRefcnt() 90 { 91 _pstr[size()+1]=1; 92 } 93 void increaseRefcnt() 94 { 95 ++_pstr[size()+1]; 96 } 97 void decreaseRefcnt() 98 { 99 --_pstr[size()+1]; 100 } 101 friend std::ostream & operator<<(std::ostream & os,const String & rhs); 102 103 private: 104 char * _pstr; 105 }; 106 107 std::ostream & operator<<(std::ostream & os,const String & rhs) 108 { 109 os << rhs._pstr; 110 return os; 111 }
转载于:https://www.cnblogs.com/m4ch0/p/7040810.html
Copy_on_write的简单实现相关推荐
- 在docker上安装部署tomcat项目 超简单,拿来主义
在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...
- Linux下tomcat的安装与卸载以及配置(超简单)
无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...
- Docker安装Apache与运行简单的web服务——httpd helloworld
Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...
- Docker的安装、镜像源更换与简单应用
Docker的安装.镜像源更换与简单应用[阅读时间:约20分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.Docker的安装 四.Docker的简单应用 1. ...
- 基于Golang的简单web服务程序开发——CloudGo
基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...
- 简单图文配置golang+vscode【win10/centos7+golang helloworld+解决install failed等情况】
博客目录(阅读时间:10分钟) 一.win10 0.系统环境 1. win10配置golang环境 ①下载相关软件 ②创建gowork工作空间 ③配置环境变量(GOPATH+PATH) ④验证环境配置 ...
- 简单介绍互联网领域选择与营销方法
在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...
- JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性
一.什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的.停工时间,就是不能向用户提供服务的时间.高可用,就是系统具有高度可用性,尽量减少停工时间.如何用最简单的方法来搭建 ...
- java发送简单邮件_Java程序实现发送简单文本邮件
/** * Java程序实现发送简单文本邮件 * * @author Administrator * */ public class SendTextMail { // 定义发件人地址 public ...
最新文章
- 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤
- arm-none-linux-gnueabi,安装交叉编译器arm-none-linux-gnueabi-gcc 过程
- 听说你想从事中间件开发?
- 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 2 )
- academic division at cssa
- VTK:可视化算法之FlyingHeadSlice
- Linux 大规模请求服务器连接数相关设置
- C/S、B/S的区别
- python字典程序题_急!一道关于python字典的编程题!求思路!
- 查看及修改当前数据库的所支持的数据库引擎以及默认数据库引擎
- 它们都是苹果公司背后那些英国科技 “力量”
- 数字图像处理--梯度倒数加权平滑法
- 如何配置Web服务器?web服务器配置方法步骤
- 真•神器:Desmos 心形曲线x4
- HP246 G6 笔记本升级
- <C++ 初阶> C++入门
- 前端埋点和后端埋点能分开使用吗?【数据埋点介绍】
- 串列配置(Tandem)在Kintex-7互联TRD中的实现
- MJ对2008年10月6日大盘预测(节后第一天)
- 通过创建动态类型 动态构建Expression Select表达式来控制Property可见性
热门文章
- SQL Server数据库有关语法
- JavaScript创建对象的三种方式之利用字面量创建对象及使用方法(1)
- 线段树i hate it
- WPF RadioButton按钮控件取消选中设置
- excel两个表格数据对比_教你如何使用excel快速对比多项数据
- bzoj 1656: [Usaco2006 Jan] The Grove 树木(BFS)
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)
- 2017 Multi-University Training Contest - Team 4:1003. Counting Divisors(积性函数)
- 拓扑排序:Kahn算法
- 过程定义伪指令proc和宏命令伪指令macro