#memory-allocator #allocator #memory #allocation #building-block

nightly allocators

可组合内存分配器及相关工具,用于创建更多

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

MIT/Apache

39KB
807

分配器

Build Status Crates.io

文档

此crate提供不同的内存分配器,以及用于创建其他自定义分配器的Allocator特质。分配器的主要目标是可组合性。因此,它还提供了一些可组合的原始数据结构,用作链式分配器的构建块。目前,此crate严重依赖不安全/不稳定代码,应被视为非常实验性的。

为什么?

为了使Rust能够实现其作为系统编程语言的描述,用户需要对其程序中内存分配的方式有更精细的控制。此crate是一个概念验证,证明这些机制可以在Rust中实现,并为用户提供安全的接口。

分配器特质

Allocator

这是分配器实现的核心特质。类型必须实现两个不安全函数:allocate_rawdeallocate_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 特性的对象,该特性提供了以任意方式记录分配、释放和重新分配的函数。它在调试构建中用于测量分配器被使用的方式,具有实际应用价值。

无运行时依赖