在 C++ 中我正在使用boost::shared_ptr
and boost::weak_ptr
自动删除不再需要的对象。我知道这些与引用计数一起工作。
在 Java 中,内存由垃圾收集器管理,它将内置对象引用视为strong, WeakReference
as weak and SoftReference http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ref/SoftReference.html作为介于两者之间的东西(可能被 GC 收集,但也可能在 GC 后幸存下来),这对于缓存对象一段时间确实很方便,但一旦可用内存变低就将它们丢弃。
所以现在我又回到了 C++,我怀念软引用带来的舒适感。我想知道软引用对于引用计数是否可行。当最后一个strong对对象的引用被清除,并且仍然存在soft引用,到底什么时候会被删除?我可以想到一些方案,但对我来说,这些方案都不聪明。
万一软引用和引用计数有正确的语义,我想知道这是否已经实现了,也许是以一种甚至与boost::shared_ptr
(或 C++ TR1 等效项std::shared_ptr
对于这个问题)。
如果两个问题的答案都是“否”,那么对象缓存场景中有哪些替代方案?
EDIT:当然,我谈论的是缓存实际上有用的情况,因为对象是costly构建(想想对数据库的多次访问和网络查询),但数量太多,无法永远保留它们。
正如其他人指出的那样,您可以找到引用计数指针 http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm(以及他们的随从weak同行 http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/weak_ptr.htm)在 Boost 库中,但是缺少什么软参考想法是对运行时环境的内存限制的一些认识。例如,在 Java 中,一个SoftReference
与 a 没有本质上的不同WeakReference
其能力;相反,它是运行时如何运行的契约保留或驱逐两种参考 http://java.sun.com/javase/7/docs/api/java/lang/ref/SoftReference.html面对不同的内存压力。
为了在 C++ 中模仿这种行为,您必须构建一个内存感知引用缓存来保存强参考在应用程序的其余部分将持有的对象上weakly。当缓存确定应用程序正在触及其内存使用上限(或任何其他约束标准)时,它将释放强引用,放弃对象以进行“收集”(达到零引用计数)并允许稍后使用弱引用检测失效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)