#vec #allocation #recycle #lifetime #extension #change #data

recycle_vec

提供了一种方法,用于回收 Vec 的底层分配,以便与不同类型的另一个 Vec 一起使用

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

Download history 22/week @ 2024-04-02 4/week @ 2024-04-09 1/week @ 2024-05-14 6/week @ 2024-05-21 4/week @ 2024-05-28

每月下载量 178
用于 vec_storage_reuse

MIT 许可证

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 来实现其功能。但是,它提供了一个安全接口。为了实现安全性,它采取了以下预防措施

  1. 它将 Vec 截断为零长度,删除所有值。这确保了不会意外地转换任意类型的值。
  2. 它检查源类型和目标类型的尺寸和对齐方式是否匹配。这确保了 Vec 的底层内存块在布局方面兼容。尺寸和对齐方式是静态检查的,因此如果编译时发生不匹配,编译将失败。
  3. 它使用 from_raw_parts 创建一个新的 Vec 值,而不是转换,这是一个其正确性值得怀疑的操作。

无运行时依赖