避免重复的对象构建 ——Reference Counting(引用计数)技术

因为今天突然看到一篇帖子在讨论C++的赋值构造,也就是 operator = 的重载, 里面说到了一个“自赋值”的问题,以前自己也看过Thinking In C++中有介绍到这个问题,于是又翻起书来,重温了一遍,发现,里面介绍到了一个很重要的技术,也就是标题所说的,Reference Counting(引用计数)的技术

 

那么,什么是“引用计数”呢?它又有什么用呢?

在我们构建对象的时候,例如,通过拷贝构造函数和operator=对一个类的对象的引用进行了一次新的构建,也就是产生了一个新的对象,有可能,一个项目中,会有很多次调用拷贝构造的情况,而且,有时候,很多对象的构建,只是为了读,也就是拿来用,而不会对其进行写入,那么,这个时候,为了节省内存的开销和效率的提高,我们就可以使用一种技术——引用计数。

 

Thinking In C++一书中是这么说的:

You give intelligence to the object that’s being pointed to so it knows how many objects are pointing to it. Then copy-construction or assignment means attaching another pointer to an existing object and incrementing the reference count. Destruction means reducing the reference count and destroying the object if the reference count goes to zero.

 

应该能看懂吧,我就不详细翻译了,因为怕让人产生歧义,还是原文简单易懂。这里只是简单说明一下:你应该让这个对象知道自己被引用了多少次,当执行一次拷贝或者赋值的时候,就应该让这个对象的引用次数(ref count)加一,析构函数应该让ref count减一,然后,在ref count = 0的时候,释放这个对象的内存。

 

 

那么,这个时候,很有可能会产生一个问题:当我有时需要对我这个类的对象进行write,也就是,改变其中的某个属性,那么,不是会造成与这个对象共用同一块内存的对象的属性也改变吗?这个时候,就需要用到另一个技术:copy on write(有人翻译成“写拷贝”,也就是说,当我需要对这个对象进行“写”操作,即,如上所说,改变其某个属性的时候,就应该copy一下这个对象的内容去构建一个新的对象,而不是简单的在原来这个对象上进行修改)。

 

那么,应该怎么来控制这个写操作呢?其实很简单,只需要在这个类中对其对象的属性有修改的成员函数中,在修改属性之前,判断一下,这个对象的存储单元当前没有被其他的对象引用,也就是ref count = 1,此时,才可以对当前对象进行改变;如果,ref count > 1,那么,就需要在这个函数最开始部分先开辟一块新的内存来copy一个与当前对象属性相同的对象

 

 

说了这么一大通,到底应该怎么做呢?我们直接来看代码:同样摘自Thinking In c++ ,

可能有点长,不过,为了搞清楚,也不能省事,其中加入了自己的注释,便于理解

 

 

程序运行的结果如下:

 

 

通过对源码的断点跟踪,相信应该不难理解原因……

我也不再赘言……欢迎交流……

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值