写入时复制(Copy-on-write)机制
含义:
写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时要求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的(transparently)。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。
应用案例:
Copy-On-Write在string类中的应用体现:
#include<stdio.h>
#include<string>
using namespace std;
main()
{
string str1 = "hello world";
string str2 = str1;
printf ("Sharing the memory:\n");
printf ("str1 address: %x\n", str1.c_str() );
printf ("str2 address: %x\n", str2.c_str() );
printf ("After Copy-On-Write:\n");
str1[1]='q';
str2[1]='w';
printf ("str1's address: %c\n", str1[0]);
printf ("str2's address: %c\n", str1[1] );
printf ("str1's address: %x\n", str1.c_str() );
printf ("str2's address: %x\n", str2.c_str() );
return 0;
}
代码中str2用str1构造,此时两个对象共享同一块内存addr1。当执行str1[1]='q';时,string类的cow机制就体现出来了,在该过程中会copy一个副本给str1,地址为addr2,让其修改str1[1]='q';,修改后内存值为str2为"hqllo world"。但是str2内存地址仍然不变,地址中存的东西也不变。
[[email protected] mytest]$ g++ cowTest.cpp -g -o cowTest
[[email protected] mytest]$ ./cowTest
Sharing the memory:
str1 address: 5e6d028
str2 address: 5e6d028
After Copy-On-Write:
str1's address: h
str2's address: q
str1's address: 5e6d058
str2's address: 5e6d028
从结果中我们可以看到,在开始的两个语句后,str1和str2存放数据的地址是一样的,而在修改内容后,str1的地址发生了变化,而str2的地址还是原来的。这就是string类实现的Copy-On-Write技术。