Crate copy_arena [−] [src]
A memory allocation arena specialized for types implement Copy.
An Arena
can allocate objects more efficiently than a
general-purpose allocator, but the objects cannot be
deallocated until the Arena
itself is destroyed.
To actually allocate out of an Arena
after creating it,
use its allocator()
method to create an Allocator
.
Examples
Basic usage works as follows:
use copy_arena::Arena; let mut arena = Arena::new(); let mut allocator = arena.allocator(); let a: &mut i32 = allocator.alloc(5); let b: &mut f64 = allocator.alloc_default(); let c: &mut [u8] = allocator.alloc_slice(b"some text"); let b: &mut [usize] = allocator.alloc_slice_fn(10, |idx| idx + 1); let e: &mut [u32] = allocator.alloc_slice_default(10);
A slightly more realistic use case would be to create a tree without allocating from the heap for each node.
use copy_arena::{Arena, Allocator}; #[derive(Copy, Clone)] struct Tree<'a> { left: Option<&'a Tree<'a>>, right: Option<&'a Tree<'a>>, content: u32 } fn build_little_tree<'a>(allocator: &mut Allocator<'a>) -> &'a Tree<'a> { let left = allocator.alloc(Tree { left: None, right: None, content: 8 }); let right = allocator.alloc(Tree { left: None, right: None, content: 16 }); let parent = allocator.alloc(Tree { left: Some(left), right: Some(right), content: 13 }); parent } let mut arena = Arena::new(); let mut allocator = arena.allocator(); let root = build_little_tree(&mut allocator); assert_eq!(root.content, 13); assert_eq!(root.left.unwrap().content, 8); assert_eq!(root.right.unwrap().content, 16);
Structs
Allocator |
Allows allocation out of arena. |
Arena |
Holds the backing memory for allocated objects out of itself. |