一、什么是写时拷贝
Linux等的文件管理系统使用了写时复制策略。
举个例子,比如我们有个程序要写文件,不断地根据网络传来的数据写,如果每一次fwrite或是fprintf都要进行一个磁盘的I/O操作的话,都简直就是性能上巨大的损失,
因此通常的做法是,每次写文件操作都写在特定大小的一块内存中(磁盘缓存),只有当我们关闭文件时,才写到磁盘上(这就是为什么如果文件不关闭,所写的东西会丢失的原因)
class String { public: //构造函数(分存内存) String(char* tmp) { _Len = strlen(tmp); _Ptr = new char[_Len + 1 + 1]; strcpy(_Ptr, tmp); // 在数组尾部设置引用计数 _Ptr[_Len + 1] = 0; } //析构函数 ~String() { //引用计数减一 _Ptr[_Len + 1]--; // 引用计数为0时,释放内存 if (_Ptr[_Len + 1] == 0) { delete[] _Ptr; } } //拷贝构造(共享内存) String(string& str) { if (this->_Ptr != str) { //共享内存,.data()返回的是将string的类型转换成char类型的指针 const char *p = str.c_str(); char* pp; strcmp(pp, p); this->_Ptr = pp; this->_Len = str.size(); this->_Ptr[_Len + 1] ++; //引用计数加一 } } //对[]符进行重载,对字符串进行操作的时候,开始写时复制 char& operator[](unsigned int idx) { if (idx > _Len || _Ptr == 0) { static char nullchar = 0; return nullchar; } //引用计数减一 _Ptr[_Len + 1]--; char* tmp = new char[_Len + 1 + 1]; strncpy(tmp, _Ptr, _Len + 1); _Ptr = tmp; // 设置新的共享内存的引用计数 _Ptr[_Len + 1] = 0; return _Ptr[idx]; } private: int _Len; char* _Ptr; };
原文:https://www.cnblogs.com/-citywall123/p/13026603.html