写时拷贝

来源:互联网 发布:江彬和钱宁 知乎 编辑:程序博客网 时间:2024/05/21 09:47

写时拷贝(Copy-On-Write),就是编程界“懒惰行为”--拖延战术的产物。举个例子,比如我们有个程序要写文件,不断地根据网络传来的数据写,如果每一次fwrite或是fprintf都要进行一个磁盘的I/O操作的话,都简直是性能上巨大的损失,因此通常做法是,每次写操作都写在特定大小的一块内存中(磁盘缓存),只有当我们关闭文件时,才写到磁盘上(这就是为什么如果文件不关闭,所写的东西会丢失的原因)。更有甚者是文件关闭时都不写磁盘,而一直等到关机或者是内存不够时才写磁盘,Unix就是这样一个系统,如果非正常退出,那么数据就会丢失,文件就会损坏。

而标准库中的string类也是一个具备写时拷贝的类。

看下面的程序:

这个程序的意图就是让第二个string通过第一个string构造,然后打印出其存放数据的内存地址,然后分别修改str1str2的内容,再查一下其存放内存的地址。程序的输出是这样的:


在构造时,str2的地址与str1的地址相同,也就是它们两指向同一块内存,但是在修改str1的地址发生了变化,str2地址没有变化,这便是string类的写时拷贝了。


写时拷贝在实现时,用到了“引用计数”的方法,即在创建一个对象时,便在其内存前创建了一个空间作为计数,如果有其他指针指向这块内存时,计数加一,反之,则减一,当计数为1或者是0时,系统才会将这块空间进行free释放。


这幅图便清楚的解释了写时拷贝时的内存空间是怎样。


原创粉丝点击