4 个版本
使用旧的 Rust 2015
0.1.9 | 2016年1月11日 |
---|---|
0.1.7 | 2015年10月18日 |
0.1.6 | 2015年10月16日 |
0.1.5 | 2015年10月16日 |
在 内存管理 中排名第 335
39KB
807 行
分配器
文档
此crate提供不同的内存分配器,以及用于创建其他自定义分配器的Allocator
特质。分配器的主要目标是可组合性。因此,它还提供了一些可组合的原始数据结构,用作链式分配器的构建块。目前,此crate严重依赖不安全/不稳定代码,应被视为非常实验性的。
为什么?
为了使Rust能够实现其作为系统编程语言的描述,用户需要对其程序中内存分配的方式有更精细的控制。此crate是一个概念验证,证明这些机制可以在Rust中实现,并为用户提供安全的接口。
分配器特质
Allocator
这是分配器实现的核心特质。类型必须实现两个不安全函数:allocate_raw
和 deallocate_raw
。将来可能还需要 reallocate_raw
。
BlockOwner
实现此特质的分配器可以明确地说它们拥有一个块。
分配器类型
作用域分配器
这对于在紧循环中重复使用内存块进行临时分配很有用。作用域可以是嵌套的,作用域内分配的值不能移出作用域。
#![feature(placement_in_syntax)]
use allocators::{Allocator, Scoped};
#[derive(Debug)]
struct Bomb(u8);
impl Drop for Bomb {
fn drop(&mut self) {
println!("Boom! {}", self.0);
}
}
// new scoped allocator with a kilobyte of memory.
let alloc = Scoped::new(1024).unwrap();
alloc.scope(|inner| {
let mut bombs = Vec::new();
// allocate_val makes the value on the stack first.
for i in 0..100 { bombs.push(inner.allocate(Bomb(i)).unwrap())}
// watch the bombs go off!
});
// Allocators also have placement-in syntax.
let my_int = in alloc.make_place().unwrap() { 23 };
println!("My int: {}", *my_int);
空闲列表分配器
此分配器维护一个给定大小的空闲块列表。
use allocators::{Allocator, FreeList};
// create a FreeList allocator with 64 blocks of 1024 bytes.
let alloc = FreeList::new(1024, 64).unwrap();
for _ in 0..10 {
// allocate every block
let mut v = Vec::new();
for i in 0u8..64 {
v.push(alloc.allocate([i; 1024]).unwrap());
}
// no more blocks :(.
assert!(alloc.allocate([0; 1024]).is_err());
// all the blocks get pushed back onto the freelist at the end here,
// memory gets reused efficiently in the next iteration.
}
在这种情况下,每个块的整个空间都被充分利用,此分配器可以提供非常好的性能。
可组合原始数据结构
目前这些数据结构发展得非常有限,并且缺乏流畅的API。它们目前绝对是一个备选功能,因为可组合分配器的理念尚未真正证明其价值。
空分配器
这可能会得到一个新名称,因为“空”有一些误导性的含义。
它无法分配对其提出的任何请求,并在释放时引发恐慌。
后备分配器
此分配器组合了两个 BlockOwners
:主分配器和后备。如果主分配器无法分配,它将转向后备。
代理分配器
该包装器可以包裹任何分配器以及实现 ProxyLogger
特性的对象,该特性提供了以任意方式记录分配、释放和重新分配的函数。它在调试构建中用于测量分配器被使用的方式,具有实际应用价值。