#stack-memory #stack #allocation #unsized #array #slice

无std dyn-stack

为动态分配提供动态堆栈包装器

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

Download history 15746/week @ 2024-04-22 15458/week @ 2024-04-29 13712/week @ 2024-05-06 16302/week @ 2024-05-13 15277/week @ 2024-05-20 17236/week @ 2024-05-27 17039/week @ 2024-06-03 17258/week @ 2024-06-10 16184/week @ 2024-06-17 16726/week @ 2024-06-24 16656/week @ 2024-07-01 14996/week @ 2024-07-08 15000/week @ 2024-07-15 15772/week @ 2024-07-22 18475/week @ 2024-07-29 15120/week @ 2024-08-05

65,214次每月下载
用于140 crate(28个直接使用)

MIT许可证

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