引用计数的写时拷贝

提起写时拷贝,自然就得说到深浅拷贝的问题了,到底什么是深浅拷贝呢?深浅拷贝到底都做了什么?


浅拷贝:浅拷贝是位拷贝,使俩个对象指向了同一块空间,并没有重新开辟一块新的空间。一个对象如果对这块空间进行了改变,则另一个对象也会跟着改变。

引用计数的写时拷贝


深拷贝:深拷贝就是另外开辟一个空间出来,将原有的数据全部复制一份放到新的空间中,然后把新的空间交给你,经过深拷贝的对象和原有的对象不会指向同一空间,所以一个对象的改变不会影响另外一个空间。

引用计数的写时拷贝


引用计数: 加入引用计数的目的是为了解决类中的浅拷贝问题,例如一个string类中,如果拷贝构造函数是浅拷贝,如果没有引入引用计数的话一块空间则会被释放多次从而导致程序崩溃,加入引用计数后,当计数减减到0的时候再对空间进行释放,这样就有效的防止了程序的崩溃。

引用计数的写时拷贝

上述的引用计数虽然解决了空间释放的问题,但是我们有时候需要改变一个对象,但是期望在改变一个对象的时候不会影响到其他对象,这个时候我们就需要引入引用计数的写时拷贝了,当我们使用拷贝构造或者赋值运算符重载时,俩个对象指向了同一块空间,但是当我们需要修改其中一个对象时,此时就会为需要改变的对象开辟一个独立的空间,这个时候这个对象的改变就不会影响其他的空间了。

引用计数的写时拷贝

写时拷贝有俩种实现方法,一种是上面的单独定义一个recount,还有一种是在字符串开头的4个空间处引入。

写时拷贝在需要开辟空间时再开辟,不需要的时候多个对象公用一块空间,充分利用了空间。

0
 
0