2个版本
使用旧的Rust 2015
0.1.1 | 2015年8月11日 |
---|---|
0.1.0 | 2015年8月8日 |
#706 在 内存管理
在 arendur 中使用
13KB
211 行
此Rust模块为实现了Copy的类型提供内存分配区域。
示例
基本用法如下
extern crate copy_arena;
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);
这可以用于构建树结构,每个节点无需堆分配
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
}
#[test]
fn make_tree() {
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);
}
与std::arena::Arena相比
此区域与Rust标准库中的(不稳定)区域在几个方面有所不同
- 此区域仅支持可
Copy
对象 -- 不会执行析构函数。 - 此区域不使用动态借用检查,在获取要分配的底层数据之前节省了两个RefCells和一个Rc,但导致API略微不便。