千家信息网

怎么实现C++写时拷贝

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"怎么实现C++写时拷贝",在日常操作中,相信很多人在怎么实现C++写时拷贝问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么实现C++写时拷贝"的疑惑
千家信息网最后更新 2026年11月01日怎么实现C++写时拷贝

这篇文章主要介绍"怎么实现C++写时拷贝",在日常操作中,相信很多人在怎么实现C++写时拷贝问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么实现C++写时拷贝"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、什么是写时拷贝

写入时复制是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。

这个过程对其他的调用者是透明的(transparently)。

此作法的主要优点是如果调用者没有修改该资源,就不会有副本被建立,因此多个调用者只是读取操作是可以共享同一份资源。

写时拷贝技术是一种很重要的优化手段,核心是懒惰处理实体资源请求,在多个实体资源之间只是共享资源,起初是并不真正实现资源拷贝,只有当实体有需要对资源进行修改时才真正为实体分配私有资源。但写时拷贝技术技术也有它的优点和缺点:

1、写时拷贝技术可以减少分配和复制大量资源时带来的瞬间延时,但实际上是将这种延时附加到了后续的操作之中。

2、写时拷贝技术可以减少不必要的资源分配。比如fork进程时,并不是所有的页面都需要复制,父进程的代码段和只读数据段都不被允许修改,所以无需复制。

二、写时拷贝技术的应用

1、虚拟内存管理中的写时复制

一般把这种被共享访问的页面标记为只读。当一个task试图向内存中写入数据时,内存管理单元(MMU)抛出一个异常,内核处理该异常时为该task分配一份物理内存并复制数据到此内存,重新向MMU发出执行该task的写操作。

比如 Linux的fork()使用写时拷贝页来实现新进程的创建,它是一种可推迟甚至避免数据拷贝的技术,开始时内核并不会复制整个地址空间,而是让父子进程共享地址空间,只有在写时才复制地址空间,使得父子进程都拥有独立的地址空间,即资源的复制是在只有需要写入时才会发生。在此之前都是以读的方式去和父进程共享资源,这样,在页根本不会被写入的场景下,fork()立即执行exec(),无需对地址空间进行复制,fork()的实际开销就是复制父进程的一个页表和为子进程创建一个进程描述符,也就是说只有当进程空间中各段的内存内容发生变化时,父进程才将其内容复制一份传给子进程,大大提高了效率。

2、数据存储中的写时复制

Linux等的文件管理系统使用了写时复制策略。

举个例子,比如我们有个程序要写文件,不断地根据网络传来的数据写,如果每一次fwrite或是fprintf都要进行一个磁盘的I/O操作的话,都简直就是性能上巨大的损失,

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

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

到此,关于"怎么实现C++写时拷贝"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

拷贝 资源 内存 进程 技术 数据 用者 空间 只有 地址 文件 C++ 实体 磁盘 分配 学习 相同 内容 多个 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 湖北九亚互联网络科技有限公司 科技股互联网 新华互联网科技学院 河南真二互联网科技有限公司 合肥互联网科技公司 互联网金融科技创新 郑州华宇互联网科技 长亮科技 互联网金融 恒生科技互联网指数分析 华服互联网科技官网 洛阳昕诺飞互联网科技有限公司 银川新华互联网科技学校联系电话 浙南科技城互联网大厦建设工程 广州百诚互联网科技有限公司官网 互联网高科技行业有哪些企业 互联网金融金融科技 互联网科技大佬云集 安徽九吞吴互联网科技有限公司 瑞安市蟠桃会互联网科技有限公司 互联网科技产业 互联网和科技创新 深圳天众互联网科技公司 成都仁贤领冠互联网科技有限公司 现代科技和互联网有关系吗 四川慕妮娅互联网科技有限公司 无锡工业互联网科技有限公司 合肥互联网科技公司公章图片 西安有哪些互联网高科技企业 福仕德教育科技互联网
0