9个版本
0.3.3 | 2021年3月26日 |
---|---|
0.3.2 | 2020年11月22日 |
0.3.1 |
|
0.2.6 |
|
0.1.1 | 2020年1月7日 |
#228 in 内存管理
33 每月下载量
105KB
2.5K SLoC
移动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