因此通常的做法是,每次写文件操作都写在特定大小的一块内存中(磁盘缓存),只有当我们关闭文件时,才写到磁盘上(这就是为什么如果文件不关闭,所写的东西会丢失的原因)
3、软件应用中的写时复制
在我们经常使用的STL标准模板库中的string类,也是一个具有写时才拷贝技术的类。为了提高性能,STL中的许多类都采用了写时拷贝技术。但是在C++11标准中为了提高并行性取消了这一策略
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;
};
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。










