[][src]Crate static_alloc

General purpose global allocator(s) with static, inline storage.

Provides an allocator for extremely resource constrained environments where the only memory guaranteed is your program's image in memory as provided by the loader. Possible use cases are OS-less development, embedded, bootloaders (even stage0/1 maybe, totally untested).

Usage

use static_alloc::Slab;

#[global_allocator]
static A: Slab<[u8; 1 << 16]> = Slab::uninit();

fn main() {
    let v = vec![0xdeadbeef_u32; 128];
    println!("{:x?}", v);

    let buffer: &'static mut [u32; 128] = A.leak([0; 128])
        .unwrap_or_else(|_| panic!("Runtime allocated before main"));
}

FixedVec without forced Clone or Copy semantics:

use static_alloc::{FixedVec, Uninit};
use core::mem::MaybeUninit;

let mut pool: MaybeUninit<[u8; 1024]> = MaybeUninit::uninit();
let mut vector = FixedVec::from_available(Uninit::from(&mut pool));

let mut num = 0;
// Push a mutable reference, not `Copy` nor `Clone`!
vector.push(&mut num);

*vector.pop().unwrap() = 4;
drop(vector);

assert_eq!(num, 4);

Why the name?

This crates makes it safe to define a static object and to then use its memory to allocate dynamic values without accidentally exposing or using uninitialized memory. This allows obtaining &'static mut T instances which is handy if a struct requires a mutable reference but it is also required that this struct has 'static lifetime bounds itself.

Re-exports

pub use fixed_vec::FixedVec;
pub use uninit::Uninit;
pub use slab::Slab;

Modules

fixed_vec

Contains the FixedVec implementation.

slab

The slab allocator.

uninit

Safe abstractions around pointing at uninitialized memory without references.