6个版本

0.2.1 2023年6月27日
0.2.0 2023年6月27日
0.1.3 2023年6月26日

#200 in 内存管理

每月 25 次下载

MIT许可证

29KB
498

片段

Crates.io Documentation

片段是Rust的一系列可组合分配器。

分配器

目前这个crate包含两个分配器,piece::LinearAllocatorpiece::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