文章目录

  • 写时拷贝技术
  • 写时拷贝技术原理
    • 举个例子

写时拷贝技术

  写时拷贝技术实际上是一种拖延战术,是为了提高效率而产生的技术,这怎么提高效率呢?实际上就是在需要开辟空间时,假装开了空间,实际上用的还是原来的空间,减少开辟空间的时间,等到真正要使用新空间的时候才去真正开辟空间。
  举一个例子理解写时拷贝技术:我们小时候经常会遇到这种情况:家里面有哥哥姐姐的,大人们经常会让我们穿哥哥姐姐穿剩的衣服,这样看起来我们就有了新衣服,但实际上我们穿的还是哥哥姐姐的旧衣服,等到我们真的长大了,才会给我们买属于自己的新衣服,这样节省了给我们买衣服的时间和财力。从而节省了很多资源(提高效率)。等我们真的需要时才不得不买新衣服(拖延战术)。

写时拷贝技术原理

  写时拷贝技术实际上是运用了一个 “引用计数” 的概念来实现的。在开辟的空间中多维护四个字节来存储引用计数。
有两种方法:
①:多开辟四个字节(pCount)的空间,用来记录有多少个指针指向这片空间。
②:在开辟空间的头部预留四个字节的空间来记录有多少个指针指向这片空间。
  当我们多开辟一份空间时,让引用计数+1,如果有释放空间,那就让计数-1,但是此时不是真正的释放,是假释放,等到引用计数变为 0 时,才会真正的释放空间。如果有修改或写的操作,那么也让原空间的引用计数-1,并且真正开辟新的空间。

linux 下的 fork() 就是用的写时拷贝技术,引用计数不光在 string 这里用到,还有智能指针 shared_ptr 也用到了引用计数来解决拷贝问题。

举个例子

string 的写时拷贝(维护一个指针):

class String
{public://构造String(const char* str):_str(new char[strlen(str) + 1]),_pCount(new int(1)){strcpy(_str, str);}//拷贝构造String(const String& s):_str(s._str),_pCount(s._pCount){(*_pCount)++;}//赋值运算符重载String& operator=(const String& s){if(_str != s._str){if(--(*_pCount) == 0){delete[] _str;delete _pCount;}_str = s._str;_pCount = s._pCount;(*_pCount)++;}return *this;}~String(){if(--(*_pCount) == 0){delete[] _str;delete _pCount;}}char& operator[](size_t pos){if(*_pCount > 1){char* newstr = new char[strlen(_str) + 1];strcpy(newstr, _str);--(*_pCount);_str = newstr;_pCount = new int(1);}return _str[pos];}const char* c_str(){return _str;}
private:char* _str;int* _pCount;
};

源码中的写法:在空间的头部维护四个字节的空间,记录引用的个数。放在头部维护效率能高一些,如果放在尾部维护的话,每次开辟新的空间都要讲这四个字节也向后挪动相应的位置,所以放在前面效率高点

class String
{public://构造String(const char* str):_str(new char[strlen(str) + 4 + 1]){_str += 4;       //前四个字节放引用计数strcpy(_str, str);GetRefCount() = 1;}//拷贝构造String(const String& s):_str(s._str){GetRefCount()++;}//赋值运算符重载String& operator=(const String& s){if(_str != s._str){if(--GetRefCount() == 0){delete[] (_str - 4);}_str = s._str;GetRefCount()++;}return *this;}~String(){if(--GetRefCount() == 0){delete[] (_str - 4);_str = nullptr;}}char& operator[](size_t pos){if(GetRefCount() > 1){--GetRefCount();char* newstr = new char[strlen(_str) + 4 + 1];newstr += 4;strcpy(newstr, _str);_str = newstr;GetRefCount() = 1;}return _str[pos];}int& GetRefCount(){return *((int*)(_str - 4));       //前四个字节为引用计数}
private:char* _str;
};

写时拷贝技术(COW)相关推荐

  1. Linux 10分钟让你掌握虚拟地址--写时拷贝技术

    程序地址空间 地址:对内存单元的编号 程序是不占用内存的,运行起来的程序才会被加载到内存,才会占用空间.所以程序地址空间也叫做进程地址空间 我们先来看一下代码: zone.c #include < ...

  2. linux进程--写时拷贝技术copy-on-write(七)

    COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了"写时复制"技术,也就是只 ...

  3. Linux写时拷贝技术(copy-on-write)

    COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了"写时复制"技术,也就是只 ...

  4. 【转】Linux写时拷贝技术(copy-on-write)

    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html 源于网上资料 COW技术初窥: 在Linux程序中,fork()会 ...

  5. 写时拷贝技术(copy-on-write)

    传统的fork()系统调用直接把所有的资源复制给新创建的进程.这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃. ...

  6. Linux系统编程15:进程控制之如何创建进程和写时拷贝技术

    文章目录 (1)fork函数回顾 (2)写时拷贝 (1)fork函数回顾 在下面这篇文章我们演示了fork函数以及相关细节 点击跳转 还是借助上文中的程序和效果图片 #include <stdi ...

  7. C++ String类写时拷贝 4

    http://blog.51cto.com/zgw285763054/1839752 维基百科: 写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略.其核心思 ...

  8. 17.深浅拷贝和写时拷贝

    深浅拷贝 浅拷贝只拷贝指针,但拷贝后两个指针指向同一个内存空间: 深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针指向两个不同地址. 当类成员不包括指针何引用时,浅拷贝并无问题 ...

  9. Linux | fork()、僵死进程、写时拷贝

    目录 1. 获取进程id的方法 2. 父进程的父进程~bash 3. fork()示例 之 打印了多少个A? (1)打印3个A (2)打印6个A (3)fork()试题总结 4. 进程的结束.僵死进程 ...

最新文章

  1. linux valgrind Memcheck--内存检查工具
  2. 降低云计算成本的方法总结
  3. cpu超频有什么坏处_电脑超频知多少,让电脑打鸡血,怎么搞定
  4. hdu 4763 Theme Section(next数组找串中三段相等)
  5. Flash/Flex学习笔记(2):捕获摄像头
  6. SQL注入语法类型——报错注入
  7. php7 imagick安装,php扩展imagick安装for windows7
  8. (草稿)如何判断一名UiPath开发人员是否合格?
  9. nuttx linux 编译,linux下建立nuttx开发环境
  10. Latex中插入超链接/网址
  11. 【转载】快速掌握一个语言最常用的50%
  12. 如何提高python代码运行速度_一行代码让你的python运行速度提高100倍
  13. Linux中scp报 not a regular file错误解决方案
  14. 浏览器未安装flash插件,如何提示用户安装adobe flash player?
  15. Matlab学习日记(2)输入与输出
  16. 计算机教学得意之处,看不懂没关系,知道厉害就行了:中科大俩教授11年解了两道数学难题...
  17. 大数据学前准备--zookeeper详解与集群搭建(保姆级教程)
  18. 【计算方法】实验二:python实现高斯消去、列主元高斯消去,LU分解分别求解线性方程组
  19. 感谢这一年的尚不如愿,这是下一年必须努力的理由
  20. 自动生成马斯克的推特几乎无破绽!MIT用GPT-2模型做了个名人发言模仿器

热门文章

  1. C# 调用kettle的转换transaction和Job
  2. AIX 12.1.0.2 rtld: 0712-001 Symbol CreateIoCompletionPort was referenced from module
  3. nuxt2,服务端渲染应用框架, 从创建开发到部署上线
  4. React Native 三端同构实战
  5. SQL Server 安装教程 2020
  6. 洛谷刷题C语言:【Mc生存】经验值、开灯、乘积最大3、三角函数、电梯里的爱情
  7. java 大结果_java三大工厂结果总览
  8. 路在何方?大龄程序员不得不思考的2个问题
  9. 辽宁科技大学计算机与软件学院,辽宁科技大学计算机与软件工程学院导师简介-吴建胜...
  10. TeX Live和Texmaker的连接