6个版本
0.2.1 | 2023年6月27日 |
---|---|
0.2.0 | 2023年6月27日 |
0.1.3 | 2023年6月26日 |
#200 in 内存管理
每月 25 次下载
29KB
498 行
片段
片段是Rust的一系列可组合分配器。
分配器
目前这个crate包含两个分配器,piece::LinearAllocator
和piece::ChainAllocator
。
线性分配器
piece::LinearAllocator
是一个内部保持固定大小缓冲区的分配器,并使用它进行分配。一旦缓冲区满了,所有后续的分配都将失败。
当您想为具有相同生命周期的多个小型分配提供“临时空间”时,此分配器非常有用。
用法
#![cfg_attr(not(feature = "stable"), feature(allocator_api))]
#[cfg(feature = "vec")]
{
use core::mem::size_of;
use piece::vec::Vec;
use piece::LinearAllocator;
let linear_allocator = LinearAllocator::with_capacity(64 * size_of::<i32>());
let mut vec1 = Vec::with_capacity_in(32, &linear_allocator);
let mut vec2 = Vec::with_capacity_in(32, &linear_allocator);
vec1.extend_from_slice(&[1, 2, 3, 4, 5]);
vec2.extend_from_slice(&[6, 7, 8, 9, 10]);
assert_eq!(vec1, &[1, 2, 3, 4, 5]);
assert_eq!(vec2, &[6, 7, 8, 9, 10]);
}
链式分配器
当现有分配器中的所有内存都被使用时,piece::ChainAllocator
将创建一个新的类型A
的分配器。
当与piece::LinearAllocator
一起使用时,这可能非常有用。例如,当所有内存都使用完毕时,ChainAllocator
将创建一个新的。当您想要使用固定大小的分配器但又担心程序会耗尽内存时,这非常有用。
用法
#![cfg_attr(not(feature = "stable"), feature(allocator_api))]
#[cfg(feature="vec")]
{
use core::mem::size_of;
use piece::vec::Vec;
use piece::LinearAllocator;
use piece::ChainAllocator;
// Make room for the allocator pointer
let chain_allocator = ChainAllocator::new(|| {
LinearAllocator::with_capacity(32 * size_of::<i32>() + size_of::<*const ()>())
});
// Create two vectors that fills the whole `LinearAllocator` so
// each `Vec` creates a new allocator
let mut vec1 = Vec::with_capacity_in(32, &chain_allocator);
let mut vec2 = Vec::with_capacity_in(32, &chain_allocator);
vec1.extend_from_slice(&[1, 2, 3, 4, 5]);
vec2.extend_from_slice(&[6, 7, 8, 9, 10]);
assert_eq!(vec1, &[1, 2, 3, 4, 5]);
assert_eq!(vec2, &[6, 7, 8, 9, 10]);
assert_eq!(2, chain_allocator.allocator_count());
}
夜间频道
您应该在nightly构建上启用Rust feature_api
,在crate根目录下添加#![feature(allocator_api)]
。
稳定频道
要在稳定频道上使用此库,您应启用stable
功能。这将启用piece
使用allocator_api2
,它包含不稳定夜间Allocator
trait的镜像。您应该能够使用任何泛型为allocator_api2::Allocator
的集合。
依赖项
~65KB