2 个不稳定版本
0.2.0 | 2022年10月21日 |
---|---|
0.1.0 | 2022年2月10日 |
#249 in 内存管理
688 次每月下载
用于 11 个 crates (4 直接)
29KB
491 行
recycle-box
一个用于堆分配对象的指针类型,其堆存储可以被重用。
概述
该框可以被消费以丢弃当前对象并重新使用分配的空间来存储另一个对象,该对象的类型可能不同。只有当新对象不适用于当前分配的空间时,才会分配新内存,同时考虑到其大小和对齐要求。
支持从 Sized
到 !Sized
的装箱对象强制转换,包括 Rust 稳定版。最后但同样重要的是:Pin
定义的框也可以被回收,这在反复分配 Future
时很有用。
用法
将此添加到您的 Cargo.toml
[dependencies]
recycle-box = "0.2.0"
示例
存储不同的对象,如果可能的话,重用先前分配的存储
use recycle_box::RecycleBox;
// Store an object.
let box1 = RecycleBox::new(123u64);
// Store a smaller object.
let box2 = RecycleBox::recycle(box1, 456u16); // Does not allocate
// Store a larger object.
let box3 = RecycleBox::recycle(box2, [123u32; 8]); // New memory is allocated
// Move out and replace the previous object.
let (array3, box4) = RecycleBox::replace(box3, 789u32); // Does not allocate
// Drop the current object but preserve the allocated memory for further re-use.
// Note that `vacate()` is just an explicit shorthand for `recycle(())`.
let box5 = RecycleBox::vacate(box4);
为具有相同 trait 的不同对象重用相同的框
use std::future::{self, Future};
use recycle_box::{RecycleBox, coerce_box};
let mut my_box: RecycleBox<dyn Future<Output = i32>> =
coerce_box!(RecycleBox::new(future::ready(42)));
my_box = coerce_box!(RecycleBox::new(future::pending()));
回收一个固定框。
use std::pin::Pin;
use recycle_box::RecycleBox;
let pinned_box: Pin<_> = RecycleBox::new(42).into();
let new_box = RecycleBox::recycle_pinned(pinned_box, "Forty two");
安全性
这是一个底层原语,因此其实现依赖于 unsafe
。其正确性通过一个广泛的测试套件和 MIRI 解释器来评估。
许可
本软件根据您的选择,在 Apache License,版本 2.0 或 MIT 许可证下授权。
贡献
除非您明确声明,否则您有意提交以包含在本作品中的任何贡献,根据 Apache-2.0 许可证定义,应按照上述方式双授权,没有任何额外条款或条件。