4个版本 (2个稳定版本)
1.1.0 | 2020年9月1日 |
---|---|
1.0.0 | 2020年8月15日 |
0.2.1 | 2020年8月10日 |
0.2.0 | 2020年8月10日 |
0.1.0 |
|
#437 in 内存管理
115KB
2.5K SLoC
Heapnotize
一个提供栈内存分配的Rust库。
Heapnotize可用于在内存中存储值并保持对其的引用。类似于Box
,它可以用于需要间接引用的嵌套类型。与Box
不同,此库使用#[no_std]
实现,因此可以帮助在微控制器上管理内存。
Heapnotize的两个主要数据类型是Rack
和Unit
。Rack
用于为预定义类型分配栈上的预定义块。 Unit
提供了存储在此处的值的所有权。Unit
还确保一旦它超出作用域,它引用的值将被适当地丢弃。
文档
使用方法
将以下内容添加到您的Cargo.toml
[dependencies]
heapnotize = "1.1"
为了在栈上存储值,我们首先需要使用特定的容量初始化Rack
。目前可用的容量是1到1024的2的幂。在创建Rack
时将分配整个大小。之后,可以在架子上存储值并获取它们的句柄,作为Unit
对象。可以解引用Unit
以访问值。一旦Unit
超出作用域,值将从架上释放
fn main() {
let rack = Rack64::new();
let unit = rack.must_add(10);
assert_eq!(*unit, 10);
}
Heapnotize真正有用的情况是处理递归类型时,其中类型包含相同类型的值。Rust无法在编译时知道递归类型需要多少内存,因此必须使用间接引用。这已在《The Book》中很好地介绍了,其中使用Box
来启用此功能,但这需要使用堆。以下示例展示了如何使用Rack
和Unit
在栈上处理递归类型
enum List<'a> {
Cons(i32, Unit<'a, List<'a>>),
Nil,
}
use List::{Cons, Nil};
fn main() {
let rack = Rack64::new();
let list = Cons(1, rack.must_add(Cons(2, rack.must_add(Cons(3, rack.must_add(Nil))))));
}
有关更多信息,请参阅文档。
许可证
Heapnotize遵循通用公共许可证(GPL)第3版进行分发。有关详细信息,请参阅LICENSE。
变更日志
阅读CHANGELOG.md,了解每个版本中引入的更改。