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

简介: 【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

五、总结

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

相关文章
|
6月前
|
数据挖掘 C++
C++中的科学计数法
C++中的科学计数法
1118 0
|
6月前
|
编译器 C++ 容器
【C++】STL容器——【深浅拷贝】与【写时拷贝】对比详解(拷贝构造)(10)
【C++】STL容器——【深浅拷贝】与【写时拷贝】对比详解(拷贝构造)(10)
|
6月前
|
C++
比特位计数(C++)
比特位计数(C++)
55 0
|
机器学习/深度学习 算法 测试技术
C++算法:有向图计数优化版原理及实现
C++算法:有向图计数优化版原理及实现
|
算法 测试技术 C++
C++算法:有向图访问计数的原理及实现
C++算法:有向图访问计数的原理及实现
|
C++ Python
LeetCode每日一题题解:811. 子域名访问计数-题解-python && C++源代码
LeetCode每日一题题解:811. 子域名访问计数-题解-python && C++源代码
|
C++
[OOD-More C++ Idioms] 写时拷贝 (Copy on Write)
目的 达到延迟拷贝(lazy copy)的优化目的。和延迟初始化(lazy initialization)相似, 选择在恰当的时机更加有效。
1068 0
|
7天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
34 4