#垃圾收集 #垃圾 #内存 # #图算法 #内存区域 #数据结构

no-std moving_gc_arena

使用索引和显式根的轻量级垃圾收集区域

9个版本

0.3.3 2021年3月26日
0.3.2 2020年11月22日
0.3.1 2020年6月27日
0.2.6 2020年5月12日
0.1.1 2020年1月7日

#228 in 内存管理

33 每月下载量

MPL-2.0 许可证

105KB
2.5K SLoC

Version 0.3.3 Badge MPL License Badge

移动GC区域

这是一个支持快速分配、高效垃圾收集、遍历和深度复制的索引区域库。

如果您想保持安全循环图数据结构,并使用简单、高效的垃圾收集,则应使用此库。GC操作的可访问性提供了高效的遍历和复制。此库不读取Rust栈,而是获取资源作为根,可以像任何其他资源一样使用并正常丢弃。它可以在稳定的2018 Rust上编译,并且大多数操作只需要最小的不安全代码。索引的解引用使用对区域的引用,提供了强大的安全性保证。

如果您有非常严格实时性的要求,并且无法处理与Vec重新分配相同阶的摊销成本,则不应使用此库。在当前版本中,只能进行单线程使用。由于选择的算法,此库非常适合频繁的分配,就像区域分配一样。

功能和限制的详细信息

  • 成员是固定类型和大小。
  • 在当前版本中,区域和大多数索引不是Send/Sync。
  • 在收集对象时,将按正常方式调用Drop实现。没有可以读取区域状态的终结器。
  • 垃圾收集可以自动或手动执行。每个缓冲区重新分配都会触发垃圾收集以获得最佳性能。
  • 垃圾收集速度快:它不扫描栈,也不需要额外的分配。
  • 大小尚不能调整:我们总是至少加倍大小。调用手动gc将缩小分配。
  • 可选功能允许索引检查区域和生成信息。

示例用法

use moving_gc_arena as gc;

let mut r = gc::Region::new();

struct Adj(Vec<gc::Ix<Adj>>);
impl gc::HasIx<Adj> for Adj {
 fn foreach_ix<'b, 'a : 'b, F>(&'a mut self, mut f: F) where
     F: FnMut(&'b mut gc::Ix<T>)
 {
     self.0.foreach_ix(f);
 }
}
impl Adj {
    fn new() -> Self {
        Adj(Vec::new())
    }
}

let mut obj1 = r.alloc(|_|{Adj::new()}).root();
let mut obj2 = r.alloc(|_|{Adj::new()}).root();
let mut obj3 = r.alloc(|_|{Adj::new()}).root();

// mutual cycle
obj1.get_mut(&mut r).0.push(obj2.ix());
obj2.get_mut(&mut r).0.push(obj1.ix());

// self-cycle
obj3.get_mut(&mut r).0.push(obj3.ix());

std::mem::drop(obj1);
std::mem::drop(obj3);

r.gc(); // manually-triggered collection
//obj3 now collected but obj1 and obj2 are live

无运行时依赖

功能