加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:00:10 所属栏目:百科 来源:网络整理
导读:在C中,我使用boost :: shared_ptr和boost :: weak_ptr来自动删除不再需要的对象.我知道这些工作与引用计数. 在Java中,内存由垃圾收集器管理,垃圾收集器认为内置对象引用为强,WeakReference为弱,而 SoftReference 为中间(可能由GC收集,但也可以在GC中存活),这
在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中模仿这种行为,你必须构建一个内存感知的引用缓存,它对你的应用程序的其余部分将保持弱的对象持有强引用.当缓存确定应用程序正在考虑其内存使用上限 – 或任何其他约束条件 – 它将释放强引用,放弃对象“收集”(达到零引用计数)并允许稍后使用的弱引用检测失效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读