3个版本
0.1.2 | 2021年5月8日 |
---|---|
0.1.1 | 2021年5月7日 |
0.1.0 | 2019年9月13日 |
#220 in 内存管理
用于 rsynth
17KB
163 行
VecStorage
为具有不同生命周期的值包含的向量重用内存
在某些情况下,例如编写实时音频软件时,需要预先分配内存。Rust标准库中的Vec
数据结构可用于此目的。然而,在某些情况下,您希望为具有不同生命周期的数据重用相同的Vec
,但Rust的类型系统不允许这样做。本crate旨在帮助您克服这个问题。
示例
以下代码无法编译
let mut v = Vec::with_capacity(2);
{
let x = 1; let y = 2;
v.push(&x);
v.push(&y);
v.clear(); // We stop borrowing here, but the compiler doesn't know that.
}
{
let a = 1; let b = 2;
v.push(&a);
v.push(&b);
v.clear(); // We stop borrowing here, but the compiler doesn't know that.
}
您可以使用VecStorage
解决这个问题
use vecstorage::VecStorage;
let mut v = VecStorage::<&u32>::with_capacity(2);
{
let x = 1; let y = 2;
let mut guard = v.vec_guard();
// Now guard behaves like a vector.
guard.push(&x); // No memory allocation here, we use the memory allocated in `v`.
guard.push(&y);
// If we were going to push more items on the guard, we would allocate memory.
// When guard goes out of scope, it is cleared.
}
{
let a = 1; let b = 2;
let mut guard = v.vec_guard();
// Now guard behaves like a vector.
// The memory from the previous run has been cleared ...
assert_eq!(guard.len(), 0);
guard.push(&a);
guard.push(&b);
}
文档
请参阅docs.rs上的文档。
相关crate
rsor
(代表“可重用引用切片”)是为了重用包含引用的内存而开发的,如果想要存储引用,可以作为vecstorage
的替代方案。rsor
有一个不同的API,它不依赖于运行时检查(与依赖于运行时检查的vecstorage
不同)。
贡献
我们欢迎以问题和pull request的形式进行贡献。在打开pull request之前,请先打开一个issue,以便了解后续的pull request是否可能被批准。或者,您可以通过电子邮件(电子邮件地址在提交中)进行贡献。
在发送您的贡献之前最好运行自动测试。
测试
由于此crate使用了一些unsafe
块,我们以“常规方式”和在miri
下运行测试。
以常规方式运行测试
cargo test
要运行miri
下的测试,您需要安装miri组件。然后您可以在miri
下运行以下测试
cargo +nightly miri test -- --skip forgetting
export MIRIFLAGS=-Zmiri-ignore-leaks
cargo +nightly miri test forgetting
许可证
Vecstorage根据MIT许可证或Apache许可证(版本2.0)的条款分发,由您选择。对于MIT许可证的应用,文档注释中包含的示例不被视为“本软件的实质性部分”。