先举个小例子,在我们学习c++的时候,我不相信老师没跟你提过什么是字符串string浅拷贝深拷贝的问题,就是:
string a = "i am a programer";
string b = a;
这是所谓的浅拷贝,当然我们不是在讨论浅拷贝的问题,我只是让大家知道b只是字符串"i am a programer"的一个引用,与a有相同的地位,他们都指向同一块内存地址,有兴趣可以输出一下他们的地址,一定是同一个值。(注意:在vc6.0下如此,但vs2008已经不是这样了)
当然这是我们只想简单的引用这个字符串的内容。当我们尝试去修改b的值时,如b = “i am a worker"; 之后在输出a和b的地址,这时你会发现,他们的地址不一样了。这就是使用了写时拷贝技术。
说白了就是在复制内存时,先共享原有内存空间,等待不得不复制的时候再去复制。因为复制内存是一件十分奢侈的事情。
下面我们从进程的角度来谈。
在新的进程创建了之后,这个新创建的进程会暂时共享其父进程的内存空间,也就是说子进程(新创建的进程)会复制所有与父进程内存空间相关的信息并使用它。写时复制(coty-on-write)就是针对内存复制的一种技术。上文说到,内存复制是一件十分奢侈的事情,它开销很大,因此,在父进程创建子进程时,子进程直接共享父进程的内存空间,而不去复制它。当有必要修改这个共享内存空间时,子进程才会将父进程的内存信息复制到自身的内存空间中,然后进行修改。在Android操作系统中就用到了这项技术。