C++ 写时拷贝 3
http://blog.csdn.net/ljianhui/article/details/22895505
- int swap(string &x, string &y)
- {
- string tmp(x);
- x = y;
- y = tmp;
- }
- string s1("abc");
- string s2(s1);
- string s3("edf");
- s2 += s3;
- #ifndef _STRINGV2_H_INCLUDED
- #define _STRINGV2_H_INCLUDED
- /***
- String类的部分实现,采用的内存管理策略是:隐式共享,写时复制
- 实现方法:与智能指针的实现类似
- ***/
- class String
- {
- public:
- String();
- String(const String& s);
- String(const char *pc, size_t len);
- String(const char *pc);
- ~String();
- String& operator=(const String &s);
- String& operator=(const char *s);
- String& operator+=(const String &rhs);
- String& operator+=(const char *rhs);
- void clear();
- size_t getLength()const {return _length;}
- const char* cstr()const {return _cstr;}
- private://function
- void _initString(const char *cstr, size_t len);
- void _decUsed();
- char* _renewAndCat(const char *cstr, size_t len);
- void _addString(const char *cstr, size_t len);
- void _addAssignOpt(const char *cstr, size_t len);
- private://data
- char *_cstr;
- size_t *_used;
- size_t _length;
- size_t _capacity;
- };
- String operator+(const String &lhs, const String &rhs);
- std::ostream& operator <<(std::ostream &os, const String &s);
- std::istream& operator >>(std::istream &in, String &s);
- #endif // _STRINGV2_H_INCLUDED
- String::String():
- _cstr(NULL),
- _used(new size_t(1)),
- _length(0),
- _capacity(0)
- {
- }
- String s1("abc");
- String s2;
- s2 = s1;
- String::String(const String &s):
- _cstr(s._cstr),
- _used(s._used),
- _length(s._length),
- _capacity(s._capacity)
- {
- ++*_used;
- }
- String::String(const char *cstr, size_t len)
- {
- if(cstr == NULL)
- return;
- size_t str_len = strlen(cstr);
- if(len <= str_len)
- {
- _initString(cstr, len);
- }
- }
- void String::_initString(const char *cstr, size_t len)
- {
- if(cstr == NULL)
- return;
- _cstr = new char[len + 1];
- memcpy(_cstr, cstr, len);
- _cstr[len] = 0;
- _used = new size_t(1);
- _length = len;
- _capacity = len;
- }
- String::String(const char *cstr)
- {
- if(cstr == NULL)
- return;
- size_t len = strlen(cstr);
- _initString(cstr, len);
- }
- String::~String()
- {
- _decUsed();
- }
- void String::_decUsed()
- {
- --*_used;
- if(*_used == 0)
- {
- if(_cstr != NULL)
- {
- delete[] _cstr;
- _cstr = NULL;
- _length = 0;
- _capacity = 0;
- }
- delete _used;
- _used = NULL;
- }
- }
- String& String::operator=(const String &s)
- {
- ++*(s._used);
- _decUsed();
- _cstr = s._cstr;
- _length = s._length;
- _capacity = s._capacity;
- return *this;
- }
- String& String::operator=(const char *cstr)
- {
- if(cstr != NULL)
- {
- _decUsed();
- size_t len = strlen(cstr);
- _initString(cstr, len);
- }
- return *this;
- }
- String& String::operator+=(const String &s)
- {
- _addAssignOpt(s._cstr, s._length);
- return *this;
- }
- String& String::operator+=(const char *cstr)
- {
- if(cstr != NULL)
- _addAssignOpt(cstr, strlen(cstr));
- return *this;
- }
- void String::_addAssignOpt(const char *cstr, size_t len)
- {
- if(*_used == 1)
- _addString(cstr, len);
- else
- {
- _decUsed();
- _cstr = _renewAndCat(cstr, len);
- _used = new size_t(1);
- }
- }
- void String::_addString(const char *cstr, size_t len)
- {
- //本函数,只有在引用计数为1时,才可用
- if(*_used != 1)
- return;
- if(len + _length > _capacity)
- {
- char *ptr = _renewAndCat(cstr, len);
- delete[] _cstr;
- _cstr = ptr;
- }
- else
- {
- strncat(_cstr, cstr, len);
- _length += len;
- }
- }
- char* String::_renewAndCat(const char *cstr, size_t len)
- {
- size_t new_len = len + _length;
- size_t capacity = new_len;
- capacity += (capacity >> 1);
- char *ptr = new char[capacity+1];
- if(_cstr != NULL)
- memcpy(ptr, _cstr, _length);
- ptr[_length] = 0;
- _length = new_len;
- _capacity = capacity;
- strncat(ptr, cstr, len);
- return ptr;
- }
- void String::clear()
- {
- _decUsed();
- _cstr = NULL;
- _used = new size_t(1);
- _length = 0;
- _capacity = 0;
- }
- String operator +(const String &lhs, const String &rhs)
- {
- String stemp(lhs);
- stemp += rhs;
- return stemp;
- }
- ostream& operator << (ostream &os, const String &s)
- {
- os<<s.cstr();
- return os;
- }
- istream& operator >> (istream &in, String &s)
- {
- const int BUFFER_SIZE = 256;
- char buffer[BUFFER_SIZE];
- char *end = buffer + BUFFER_SIZE -1;
- s.clear();
- do
- {
- //用于判断是否读完输入内容,因为如果还未读取的输入字符数大于buffer
- //的容量,则buffer的最后一个字符会被get函数置为'\0'
- *end = '#';
- in.get(buffer, BUFFER_SIZE);
- s += buffer;
- }while(*end == '\0');
- in.get();
- return in;
- }
- #include <iostream>
- #include "_stringv2.h"
- using std::cin;
- using std::cout;
- using std::cin;
- using std::endl;
- int main()
- {
- String s1;
- s1 = "abc";
- {
- String s2(s1);
- s2 += s1;
- cout << s2 << endl;
- }
- String s3(s1);
- cin >> s3;
- cout << s3 << endl;
- cout << s1 << endl;
- String s4 = s1 + s3;
- cout << s4 << endl;
- }
C++ 写时拷贝 3相关推荐
- 写时复制,写时拷贝,写时分裂,Copy on write
2019独角兽企业重金招聘Python工程师标准>>> 写时复制,写时拷贝,写时分裂 (Copy-on-write,简称COW)是计算机资源管理方面的一种优化技术,有着广泛的应用,比 ...
- linux进程--写时拷贝技术copy-on-write(七)
COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了"写时复制"技术,也就是只 ...
- 17.深浅拷贝和写时拷贝
深浅拷贝 浅拷贝只拷贝指针,但拷贝后两个指针指向同一个内存空间: 深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针指向两个不同地址. 当类成员不包括指针何引用时,浅拷贝并无问题 ...
- php zval_copy_static_var(),zval _ 引用计数 _ 变量分离 _ 写时拷贝
zval.引用计数.变量分离.写时拷贝 我们一步步来理解 1.php语言特性 PHP是脚本语言,所谓脚本语言,就是说PHP并不是独立运行的,要运行PHP代码需要PHP解析器,用户编写的PHP代码最终都 ...
- 写时拷贝(Copy On Write)方案详解
本文旨在通过对 写时拷贝 的四个方案(Copy On Write)分析,让大家明白写时拷贝的实现及原理. 关于浅拷贝与深拷贝,我在之前的博客中已经阐述过了 浅拷贝容易出现指针悬挂的问题,深拷贝效率低 ...
- Linux写时拷贝技术(copy-on-write)
COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了"写时复制"技术,也就是只 ...
- 【转】Linux写时拷贝技术(copy-on-write)
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html 源于网上资料 COW技术初窥: 在Linux程序中,fork()会 ...
- Java 写时拷贝容器CopyOnWriteArrayList的测试
测试代码: package copyOnWriteArrayListTest;import java.util.ArrayList; import java.util.List; import jav ...
- 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)
标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...
- 浅拷贝+引用计数--写时拷贝---模拟实现string容器
引用计数 深拷贝 多个对象共享同一份资源时,最后能够保证该资源只被释放一次 应该由哪个对象释放资源? 由最后一个使用该资源的对象去释放 怎么知道一个对象是最后一个使用该资源的对象? 给一个计数,记录使 ...
最新文章
- android 虚线
- 用户退出后还锁表的处理方法
- Boost:自动索引允许的选项
- Ubuntu 16.04安装Tomcat 8 图解
- c语言程序设计风筝图案,《C语言程序设计》作业答案
- 字体Times New Roman
- vivo Y66的usb调试模式在哪里,打开vivo Y66usb调试模式的流程
- C#3.0新特性 和 Javascript
- pythoncsv数据类型_从CSV确定数据类型-Python
- 西南科技大学OJ题 交换二叉树的孩子结点1105
- golang中的错误fatal error: concurrent map writes
- 博士申请 | 蒙纳士大学(苏州)陈存建老师招收人工智能方向全奖博士生
- c语言中void和define,C语言里面的内联函数(inline)与宏定义(#define)探讨
- Photoshop 制作水晶按钮
- 联想笔记本小新pro16酷睿版评测
- 29. Towards Unifying the Label Space for Aspect- and Sentence-basedSentiment Analysis阅读笔记
- 外存及虚拟存储器管理
- 邮件服务器arp攻击,内网PPPoE服务器,彻底化解网络ARP攻击
- 舵机的问与答及故障分析
- SAP FICO 通用三栏明细账开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)
热门文章
- 路径 (Path)–nodejs
- java连接oracle数据库 -- jdbc连接
- 去除aspx生成的页面最开始的空行
- 转]从一个男人关注的事情上 可以看出他的修养和抱负
- mysql5.7.17解压版安装_Windows中 MySQL5.7.17解压版安装步骤
- 网上linux实验平台,Linux操作系统实验教程
- ni软件管理器_NI 技术支持丨我的 NI 硬件设备不能被识别,怎么办?Windows
- java arraylist排序_最全Java集合笔记
- 计算机等级考试试题4,计算机等级考试二级模拟试题4
- dart服务器开发性能,DartVM服务器开发(第四天)--代码优化