7 个稳定版本
1.1.1 | 2024年3月16日 |
---|---|
1.0.4 | 2019年11月3日 |
1.0.1 | 2019年11月2日 |
1.0.0 | 2019年10月31日 |
在 内存管理 中排名第 109
每月下载量 178
用于 vec_storage_reuse
9KB
63 行
recycle_vec
注意:曾经有一个 RFC 旨在将此功能作为标准库的一部分。然而,它被关闭,因为 1) 即使如此小的 API 也无需完整的 RFC 2) 但语言在静态检查不变性方面的功能尚不存在,因此 API 将是不理想的,因此最好等待 const 泛型和静态检查功能赶上。
此 crate 为 recycle
提供了一个扩展方法,用于 Vec
。它旨在更改 Vec
的类型,同时在“回收”底层分配。这在将数据存储在 Vec
中的短期生命周期数据时非常有用。
let mut objects: Vec<Object<'static>> = Vec::new();
while let Some(byte_chunk) = stream.next() { // byte_chunk only lives this scope
let mut objects_temp: Vec<Object<'_>> = objects.recycle();
// Zero-copy parsing; Object has references to chunk
deserialize(byte_chunk, &mut objects_temp)?;
process(&objects_temp)?;
objects = objects_temp.recycle();
} // byte_chunk lifetime ends
关于安全性的说明
此 crate 使用内部 unsafe
来实现其功能。但是,它提供了一个安全接口。为了实现安全性,它采取了以下预防措施
- 它将
Vec
截断为零长度,删除所有值。这确保了不会意外地转换任意类型的值。 - 它检查源类型和目标类型的尺寸和对齐方式是否匹配。这确保了
Vec
的底层内存块在布局方面兼容。尺寸和对齐方式是静态检查的,因此如果编译时发生不匹配,编译将失败。 - 它使用
from_raw_parts
创建一个新的Vec
值,而不是转换,这是一个其正确性值得怀疑的操作。