28 releases

0.13.2 Oct 4, 2025
0.13.0 Jan 9, 2025
0.12.0 Jan 8, 2025
0.11.0 Sep 29, 2024
0.1.1 Mar 29, 2022

#18 in Memory management

Download history 64540/week @ 2025-07-15 65435/week @ 2025-07-22 71469/week @ 2025-07-29 92930/week @ 2025-08-05 83403/week @ 2025-08-12 76578/week @ 2025-08-19 175759/week @ 2025-08-26 91714/week @ 2025-09-02 94768/week @ 2025-09-09 101420/week @ 2025-09-16 95543/week @ 2025-09-23 102138/week @ 2025-09-30 102807/week @ 2025-10-07 111433/week @ 2025-10-14 110614/week @ 2025-10-21 121084/week @ 2025-10-28

464,330 downloads per month
Used in 471 crates (38 directly)

MIT license

86KB
2K SLoC

dynstack

Stack that allows users to allocate dynamically sized arrays.

The stack wraps a buffer of bytes that it uses as a workspace. Allocating an array takes a chunk of memory from the stack, which can be reused once the array is dropped.

Features

  • alloc: enables the allocator api.

Examples

use core::mem::MaybeUninit;
use dynstack::{DynStack, StackReq};

// 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 stack = DynStack::new(&mut buf);

{
    // We can have nested allocations.
    // 3×`i32`
    let (array_i32, substack) = stack.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.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.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);
}

Dependencies

~140KB