V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
v2byy
V2EX  ›  C++

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

  •  
  •   v2byy · 2019-07-01 14:11:38 +08:00 · 3563 次点击
    这是一个创建于 1982 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    引用计数也无法达到 GC 的效果,因为引用计数无法使相互引用的多个对象引用计数降为 0,因此这些对象也不能正确析构。
    LANB0
        8
    LANB0  
       2019-07-01 21:28:56 +08:00 via Android
    shared_ptr 和 GC 的关键区别不在引用计数,而在 RAI I。RAII 保证了引用计数的自动化。相反,GC 使用引用计数,是需要 GC 来处理计数算法的
    exonuclease
        9
    exonuclease  
       2019-07-01 23:32:25 +08:00 via iPhone
    shared_ptr 是用 reference counting 管理有多份引用的堆内存 有确定的释放时机 无法处理循环引用 一般说的 GC 是基于对象图的遍历的方法 可以处理循环引用 一般无法确定死的对象会在何时被回收
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1536 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 17:11 · PVG 01:11 · LAX 09:11 · JFK 12:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.