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 2020年8月5日

#437 in 内存管理

GPL-3.0-or-later

115KB
2.5K SLoC

Heapnotize

一个提供栈内存分配的Rust库。

Heapnotize可用于在内存中存储值并保持对其的引用。类似于Box,它可以用于需要间接引用的嵌套类型。与Box不同,此库使用#[no_std]实现,因此可以帮助在微控制器上管理内存。

Heapnotize的两个主要数据类型是RackUnitRack用于为预定义类型分配栈上的预定义块。 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来启用此功能,但这需要使用堆。以下示例展示了如何使用RackUnit在栈上处理递归类型

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,了解每个版本中引入的更改。

无运行时依赖