C++ 如何为实现不能更改的库类实现引用计数?

C++ 如何为实现不能更改的库类实现引用计数?,c++,C++,我逐渐了解到,当许多对象共享相同的数据,并且对象的创建和解包非常昂贵时,就可以进行引用计数 有人能为无法更改的library类提供如何实现它的信息吗?这些信息比我能提供的更好: 与跟踪垃圾收集相比,引用计数的主要优点是,对象一旦不再被引用,就会以增量方式被回收,收集周期不需要长时间暂停,并且每个对象的生命周期都有明确定义。在内存有限的实时应用程序或系统中,这对于保持响应性很重要。引用计数也是要实现的最简单的垃圾收集形式之一。它还允许对非内存资源(如操作系统对象)进行有效管理,这些资源通常比内存少

我逐渐了解到,当许多对象共享相同的数据,并且对象的创建和解包非常昂贵时,就可以进行引用计数

有人能为无法更改的library类提供如何实现它的信息吗?

这些信息比我能提供的更好:

与跟踪垃圾收集相比,引用计数的主要优点是,对象一旦不再被引用,就会以增量方式被回收,收集周期不需要长时间暂停,并且每个对象的生命周期都有明确定义。在内存有限的实时应用程序或系统中,这对于保持响应性很重要。引用计数也是要实现的最简单的垃圾收集形式之一。它还允许对非内存资源(如操作系统对象)进行有效管理,这些资源通常比内存少得多(跟踪GC系统为此使用终结器,但延迟回收可能会导致问题)。加权引用计数是分布式系统垃圾收集的一个很好的解决方案

如果一组活动对象占用了大部分可用内存,则会频繁触发跟踪垃圾收集周期;它需要额外的空间来提高效率。引用计数性能不会随着可用空间总量的减少而恶化

引用计数也是有用的信息,可以用作其他运行时优化的输入。例如,严重依赖不可变对象(如许多函数式编程语言)的系统可能会由于频繁复制而受到效率损失。但是,如果我们知道一个对象只有一个引用(就像许多系统中的大多数情况一样),并且在创建类似的新对象的同时,该引用将丢失(如string append语句str)← str+“a”),我们可以用原始对象上的突变来替换该操作

与跟踪垃圾收集相比,naive形式的引用计数有两个主要缺点,这两个缺点都需要额外的机制来改进:

  • 它涉及的频繁更新是效率低下的一个原因。虽然跟踪垃圾收集器会通过上下文切换和缓存线故障严重影响效率,但它们收集的频率相对较低,而对对象的访问是连续进行的。另外,不太重要的是,引用计数要求每个内存管理对象为引用计数保留空间。在跟踪垃圾收集器时,此信息隐式存储在引用该对象的引用中,从而节省了空间,尽管跟踪垃圾收集器(尤其是增量垃圾收集器)可能需要额外的空间用于其他目的
  • 上面描述的朴素算法无法处理引用循环,即直接或间接引用自身的对象。依赖于引用计数的机制永远不会考虑删除对象的循环链,因为它们的引用计数保证保持非零。处理此问题的方法存在,但也会增加引用计数的开销和复杂性-另一方面,这些方法只需应用于可能形成循环的数据,通常是所有数据的一小部分。其中一种方法是使用弱引用

使用引用的计数指针,如
boost::shared_ptr
。不需要对指向的类进行任何更改,但您将仅限于动态创建类实例。

创建一个从库的类继承的子类,并在子类中实现引用计数。

正如Jim Bruck提到的,扩展是一种机制。如果扩展是不可能的,那么可以使用委托包装方法。

不使用库,就不能有效地使用C++。但是您可以简单地将Boost源复制到您的项目中new@Deus绝对不是。引用计数字符串(例如)不必使用“new”创建。