5个版本
0.3.3 | 2020年4月12日 |
---|---|
0.3.2 | 2020年4月10日 |
0.2.3 | 2020年3月9日 |
0.2.2 | 2020年3月8日 |
0.2.1 | 2020年3月6日 |
#20 在 #cpython
在 gcmodule 中使用
5KB
76 行
gcmodule
受CPython实现启发的垃圾收集。
此库提供了一种类型 Cc<T>
。它提供了类似于stdlib Rc<T>
的共享引用计数指针。与 Rc
不同,Cc
中的引用循环可以被收集。
如果所有值都可以通过引用计数来释放,此库使用的收集器不会占用额外的内存。这与一些其他实现不同,这些实现需要手动收集以释放收集器使用的额外内存。
示例
use gcmodule::{Cc, Trace};
use std::cell::RefCell;
type List = Cc<RefCell<Vec<Box<dyn Trace>>>>;
let a: List = Default::default();
let b: List = Default::default();
a.borrow_mut().push(Box::new(b.clone()));
b.borrow_mut().push(Box::new(a.clone())); // Form a cycle.
drop(a);
drop(b); // Internal values are not dropped due to the cycle.
gcmodule::collect_thread_cycles(); // Internal values are dropped.
对于自定义结构体,它们需要实现 Trace
接口。这可以通过 #[derive(Trace)]
来完成。
use gcmodule::{Cc, Trace};
use std::cell::RefCell;
#[derive(Trace, Default)]
struct List(RefCell<Vec<Box<dyn Trace>>>);
{
let a: List = Default::default();
let b: List = Default::default();
a.borrow_mut().push(Box::new(b.clone()));
b.borrow_mut().push(Box::new(a.clone()));
}
assert_eq!(gcmodule::collect_thread_cycles(), 2); // 2 values are collected.
有关更多示例和技术细节,请参阅 文档。
类似项目
bacon-rajan-cc v0.3
- 两者都是引用计数,具有循环垃圾收集。
- 两者主要都是单线程的,并且是停止世界的。
- 主要API如
Cc<T>
和Trace
类似,甚至兼容。 gcmodule
从概念上更简单。不需要“颜色”概念。gcmodule
为多线程环境提供了ThreadedCc<T>
。bacon-rajan-cc
即使引用计数逻辑上降至0,也仍需要手动收集来释放GC元数据(但不是跟踪对象)。有关详细信息,请参阅此提交信息。
rcgc v0.1
rcgc
采用了一种新颖的方法 - 收集器持有强引用,而其他地方使用弱引用。- 因此,即使对象的引用计数(逻辑上)降至0,
rcgc
也需要手动收集来释放实际对象。
lib.rs
:
为结构体提供 derive(Trace)
支持,以实现 gcmodule::Trace
接口。
示例
use gcmodule_derive::Trace;
#[derive(Trace)]
struct S<T: gcmodule::Trace> {
a: String,
b: Option<T>,
#[trace(skip)] // ignore this field for Trace.
c: MyType,
}
struct MyType;
依赖项
~1.5MB
~35K SLoC