24次发布
0.10.0 | 2023年10月14日 |
---|---|
0.9.0 | 2023年2月24日 |
0.8.3 | 2022年10月2日 |
0.5.2 | 2022年7月27日 |
0.1.1 | 2022年3月29日 |
在内存管理类别中排名第30
65,214次每月下载
用于140个 crate(28个直接使用)
62KB
1.5K SLoC
dynstack
允许用户分配动态大小数组的堆栈。
堆栈包装了一个字节缓冲区,将其用作工作空间。分配数组会从堆栈中取出一块内存,一旦数组被丢弃,这块内存就可以被重用。
特性
std
:为错误类型启用std::error::Error
实现功能。nightly
:为DynArray
启用降级检查眼罩,并启用内存缓冲区的分配器后端。
示例
use core::mem::MaybeUninit;
use dynstack::{DynStack, StackReq};
use reborrow::ReborrowMut;
// We allocate enough storage for 3 `i32` and 4 `u8`.
let mut buf = [MaybeUninit::uninit();
StackReq::new::<i32>(3)
.and(StackReq::new::<u8>(4))
.unaligned_bytes_required()];
let mut stack = DynStack::new(&mut buf);
{
// We can have nested allocations.
// 3×`i32`
let (array_i32, substack) = stack.rb_mut().make_with::<i32, _>(3, |i| i as i32);
// and 4×`u8`
let (mut array_u8, _) = substack.make_with::<u8, _>(4, |_| 0);
// We can read from the arrays,
assert_eq!(array_i32[0], 0);
assert_eq!(array_i32[1], 1);
assert_eq!(array_i32[2], 2);
// and write to them.
array_u8[0] = 1;
assert_eq!(array_u8[0], 1);
assert_eq!(array_u8[1], 0);
assert_eq!(array_u8[2], 0);
assert_eq!(array_u8[3], 0);
}
{
// We can also have disjoint allocations.
// 3×`i32`
let (mut array_i32, _) = stack.rb_mut().make_with::<i32, _>(3, |i| i as i32);
assert_eq!(array_i32[0], 0);
assert_eq!(array_i32[1], 1);
assert_eq!(array_i32[2], 2);
}
{
// or 4×`u8`
let (mut array_u8, _) = stack.rb_mut().make_with::<i32, _>(4, |i| i as i32 + 3);
assert_eq!(array_u8[0], 3);
assert_eq!(array_u8[1], 4);
assert_eq!(array_u8[2], 5);
assert_eq!(array_u8[3], 6);
}
依赖项
~150KB