面试题: c++中的 shared_ptr 中的引用计数与 GC 有什么区别?

2019-07-01 14:11:38 +08:00
 v2byy

懵逼的说不知道。求大佬赐教一下。

3418 次点击
所在节点    C++
9 条回复
txy3000
2019-07-01 14:34:16 +08:00
GC 是从栈中根节点作 BFS 去托管堆中遍历所有的对象并标记,然后干掉所有不可达的对象, 移动标记的对象到老年公寓。 好处是可以识别环, 解决循环引用。 具体的书, 如果是 C# :CLR VIA C#,JAVA:深入理解 JVM
v2byy
2019-07-01 14:37:03 +08:00
@txy3000 GC 用引用计数的算法的呢?
txy3000
2019-07-01 14:37:32 +08:00
C++本身不带 GC BOOST 库 shared_ptr 建议去看官方文档
jmc891205
2019-07-01 14:38:46 +08:00
引用计数是 GC 的其中一种策略,是记录某个对象的引用数。当引用数变为 0 的时候,就可以销毁这个对象。
另一种被广泛应用的 GC 策略是基于 tracing。Gabage collector 会检查所有的对象是否在 root object 开始的链上是 reachable 的。那些不能被 reach 的对象就会全部被销毁。

前者的优点是可以尽快回收无用的内存,并且 GC 工作时不会导致程序运行造成太长的停顿。缺点是有循环引用的问题。
当然现在也有很多对两种 GC 进行优化的策略,尤其是基于 tracing 的 GC 对性能的影响越来越小之后,它比引用计数更受欢迎。

以上是我的理解,欢迎大家补充。
catror
2019-07-01 14:41:39 +08:00
引用计数是 GC 算法的一种,要问区别,得看对比的是哪种 GC 算法
mooncakejs
2019-07-01 14:42:52 +08:00
@v2byy 区别很多,这里最大的区别就是,gc 周期性的释放内存,有一个线程在后台清理。shared ptr 是实时释放。
noli
2019-07-01 15:29:00 +08:00
引用计数一般不被视为 GC 的手段,最主流的 GC 算法思想是 Mark and Swept,意思是标记垃圾然后清除。
这个过程中不含任何引用计数。

引用计数也无法达到 GC 的效果,因为引用计数无法使相互引用的多个对象引用计数降为 0,因此这些对象也不能正确析构。
LANB0
2019-07-01 21:28:56 +08:00
shared_ptr 和 GC 的关键区别不在引用计数,而在 RAI I。RAII 保证了引用计数的自动化。相反,GC 使用引用计数,是需要 GC 来处理计数算法的
exonuclease
2019-07-01 23:32:25 +08:00
shared_ptr 是用 reference counting 管理有多份引用的堆内存 有确定的释放时机 无法处理循环引用 一般说的 GC 是基于对象图的遍历的方法 可以处理循环引用 一般无法确定死的对象会在何时被回收

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/578940

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX