C中的软(非弱)引用 – 是否可能?有实施吗?

前端之家收集整理的这篇文章主要介绍了C中的软(非弱)引用 – 是否可能?有实施吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在C中,我使用boost :: shared_ptr和boost :: weak_ptr来自动删除不再需要的对象.我知道这些工作与引用计数.

Java中,内存由垃圾收集器管理,垃圾收集器认为内置对象引用为强,WeakReference为弱,而SoftReference为中间(可能由GC收集,但也可以在GC中存活),这是对于缓存对象有一段时间非常方便,但是一旦可用内存不足就把它们丢弃.

所以现在我又回到了C,我错过了软引用的舒适感.我想知道软引用是否适用于引用计数.当清除对象的最后一个强引用,并且仍然有一个软引用时,它什么时候会被删除?我可以想到一些方案,但对我来说似乎都不聪明.

为了防止软引用和引用计数有适当的语义,我想知道这是否已经实现,可能是以与boost :: shared_ptr(或者与此相关的C TR1等价的std :: shared_ptr)兼容的方式.

如果两个问题的答案都是否定的,那么对象缓存场景中的替代方案是什么?

编辑:
当然,我说的是缓存实际上很有用的情况,因为构造对象的成本很高(想想几次访问数据库和网络查询),但有太多东西无法永久保存.

解决方法

正如其他人所指出的,你可以在Boost库中找到 referenced counted pointers(及其服务员 weak counterparts),但软参考思想中缺少的是对运行时环境的内存限制的一些了解.例如,在Java中,SoftReference在功能上与WeakReference没有实质性的区别;相反,面对记忆压力,它是 the contract for how the runtime will preserve or evict the two kinds of references.

为了在C中模仿这种行为,你必须构建一个内存感知的引用缓存,它对你的应用程序的其余部分将保持弱的对象持有强引用.当缓存确定应用程序正在考虑其内存使用上限 – 或任何其他约束条件 – 它将释放强引用,放弃对象“收集”(达到零引用计数)并允许稍后使用的弱引用检测失效.

猜你在找的C&C++相关文章