C++写时拷贝实现原理及实例解析

2020-06-25 14:01:04于海丽

  因此通常的做法是,每次写文件操作都写在特定大小的一块内存中(磁盘缓存),只有当我们关闭文件时,才写到磁盘上(这就是为什么如果文件不关闭,所写的东西会丢失的原因)

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;
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。