【C++从0到王者】第十一站:引用计数与写时拷贝

一、浅拷贝所带来的问题

在我们使用浅拷贝的时候会出现以下两个问题

  1. 会析构两次
  2. 一个对象修改会影响另外一个

在这里插入图片描述

二、问题一的解决方案(引用计数)

我们可以使用引用计数的方法来规避这个问题

这种方法的思路是设置一个变量来获取当前有多少个对象管理着同一块空间,当且仅当引用计数为1时,才调用析构函数处理掉这块空间。
在这里插入图片描述

三、问题二的解决方案(写时拷贝)

我们的思路是这样的,我们先是浅拷贝,但是需要有引用计数,当引用计数大于1的时候,只要涉及到修改某个对象,那么就对该对象进行深拷贝。如果不需要修改,那么保持浅拷贝
在这里插入图片描述这种方案也称作延时拷贝

四、vs中对对象做出的一些处理

我们来看这段代码的运行结果

void teststring9()
{
	std::string s("hello world");
	cout << sizeof(s) << endl;
}

在这里插入图片描述
那么这是为什么呢?这个数怎么这么奇怪呢?
实际上,这是因为vs对这个对象做了一个以空间换时间的处理
vs给每个对象加了一个长度为16的buff数组。
当对象的长度不足16的时候,不需要开空间,直接放到这个数组中,当长度大于等于16的时候才进行开空间。
故16+4+4+4就是28
在这里插入图片描述

五、总结

这两种解决方案的本质其实就是延时拷贝,本质是一种博弈。因为引用计数的代价并不是很大。相当于赌的就是只要有大部分对象不会进行修改,就是赚了!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青色_忘川

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值