#生命周期 #vec #内存 #实时 #向量 #不同

vecstorage

为具有不同生命周期的值包含的向量重用内存

3个版本

0.1.2 2021年5月8日
0.1.1 2021年5月7日
0.1.0 2019年9月13日

#220 in 内存管理


用于 rsynth

MIT/Apache

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上的文档

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许可证的应用,文档注释中包含的示例不被视为“本软件的实质性部分”。

无运行时依赖