在C++程序设计的时候,经常会遇到多个对象拥有相同的值的情况。这个时候完全没有必要将这些值分开存储,而可以让这些对象共享同一份值。比如下面的字符串对象的例子:
String s1, s2, s3, s4;
s1 = s2 = s3 = s4 = “Hello, my house”;
那么各个对象拥有的值和资源如图1所示:
图1 多个对象拥有相同的值
由于s1,s2,s3,s4拥有完全相同的值,将这个值多次存储,既无必要又显得浪费资源。于是,为了让它们共同分享同一实值,就引入了写时拷贝机制(Copy On Write),即某个对象平时和其他对象共同分享一份实值,直到这个对象的值必须发生改写的时候才停止共享而将该值拷贝出来成为自己私有以便修改。很显然,引入了写时拷贝机制后,既节省了资源,又提高了程序执行效率,因为只有在改写的时候才发生拷贝动作。
为了让多个对象共享同一份实值,便引入了引用计数,以统计这个实值目前有多少个对象共享,每当新的共享到来引用计数的值就增加,共享结束,值就减少,值为0时就删除对应的内存。如图2所示:
图2 多个对象分享相同的值
此时如果要改变s4的值,如:
s4[1] = ‘a’;
那么,就应该停止s4的共享,进行Copy On Write。如图3所示:
图3 s4写时拷贝
为了支持写时拷贝机制,String类必须进行重新设计,进行必要的修改,比如引入引用计数,以及共享标志:
class String
{
public:
…
private:
int refNum;
bool bShared;
char *data;
…
}
Copyright 2011-2020 © MallocFree. All rights reserved.