我知道当许多对象共享相同的数据并且对象的创建和去除很昂贵时,就可以进行引用计数。
任何人都可以提供有关如何为无法更改的库类实现它的输入吗?
答案 0 :(得分:5)
使用引用计数的指针,如boost::shared_ptr
。不需要对指向的类进行任何更改,但您将仅限于动态创建类实例。
答案 1 :(得分:2)
创建一个继承自库类的子类,并在子类中实现引用计数。
答案 2 :(得分:1)
Wikipedia article on referencing counting表明它比我更好:
引用计数优于跟踪垃圾收集的主要优点是,一旦不再引用对象,就会以渐进的方式回收对象,而不会对收集周期进行长时间暂停,并且每个对象的生命周期都明确定义。在内存有限的实时应用程序或系统中,这对于保持响应能力非常重要。引用计数也是要实现的最简单的垃圾收集形式。它还允许有效管理非内存资源,例如操作系统对象,这些资源通常比内存更加稀缺(跟踪GC系统使用终结器,但延迟回收可能会导致问题)。加权引用计数是垃圾收集分布式系统的一个很好的解决方案。
如果活动对象集合填充了大部分可用内存,则会频繁触发跟踪垃圾收集周期;它需要额外的空间才能有效。随着可用空间总量的减少,参考计数性能不会下降。1
引用计数也是用作其他运行时优化的输入的有用信息。例如,严重依赖于诸如许多函数编程语言之类的不可变对象的系统可能由于频繁复制而遭受效率损失。但是,如果我们知道一个对象只有一个引用(就像在许多系统中一样),并且在创建类似的新对象的同时丢失该引用(如字符串append语句str←str +“a” ),我们可以用原始对象上的变异替换该操作。
天真形式的引用计数与跟踪垃圾收集相比有两个主要缺点,两者都需要额外的机制来改善:
- 它涉及的频繁更新是效率低下的根源。虽然跟踪垃圾收集器可能会通过上下文切换和缓存线故障严重影响效率,但它们相对不频繁地收集,而访问对象则不断进行。此外,不太重要的是,引用计数需要每个内存管理对象为引用计数保留空间。在跟踪垃圾收集器时,此信息隐式存储在引用该对象的引用中,从而节省空间,尽管跟踪垃圾收集器(尤其是增量垃圾收集器)可能需要额外的空间用于其他目的。
- 上述朴素算法无法处理参考周期,这是一个直接或间接指向自身的对象。纯粹依赖于引用计数的机制永远不会考虑删除对象的循环链,因为它们的引用计数保证保持非零。存在处理该问题的方法,但也可能增加引用计数的开销和复杂性 - 另一方面,这些方法仅需要应用于可能形成周期的数据,通常是所有数据的一小部分。一种这样的方法是使用弱引用。
答案 3 :(得分:0)
正如吉姆·布鲁克所说,延伸是一种机制。如果无法扩展,那么您可以使用委托包装器方法。