#bump-allocator #bump #allocator #fixed-size #memory-allocator #constant-time #arena

无 std fixed-bump

使用固定大小的块确保非摊销 O(1) 分配的 bump 分配器

12 个版本

0.3.3 2022 年 12 月 20 日
0.3.2 2022 年 12 月 18 日
0.3.0 2022 年 11 月 12 日
0.2.2 2022 年 5 月 11 日
0.1.2 2021 年 3 月 25 日

#218 in 内存管理

每月 29 次下载

GPL-3.0-or-later

50KB
536

fixed-bump

一个 bump 分配器(如 bumpalo),其内部使用固定大小的内存块。

其他 bump 分配器,如 bumpalo,针对吞吐量进行了优化:它们使用指数增长的内存块大小进行分配,从而实现摊销常数时间的分配。

fixed-bump 针对延迟进行了优化:它内部使用固定、可配置大小的内存块进行分配,并且单个值分配以非摊销常数时间执行。然而,使用此 crate 的权衡是,如果指定的块大小或对齐太小时,它可能无法分配某些类型或内存布局。请参阅 Bump::allocate 了解可能失败的条件。

此 crate 仅依赖于 corealloc,因此它可以用于支持 allocno_std 环境。

示例

# #![cfg_attr(feature = "allocator_api", feature(allocator_api))]
use fixed_bump::Bump;
struct Item(u64);

// Use chunks large and aligned enough to hold 128 `Item`s.
let bump = Bump::<[Item; 128]>::new();
let item1: &mut Item = bump.alloc_value(Item(1));
let item2: &mut Item = bump.alloc_value(Item(2));
item1.0 += item2.0;

assert_eq!(item1.0, 3);
assert_eq!(item2.0, 2);

// Can also allocate different types:
let array: &mut [u8; 8] = bump.alloc_value([0, 1, 2, 3, 4, 5, 6, 7]);
assert_eq!(array.iter().sum::<u8>(), 28);

// Can also use `&Bump` as an `Allocator` (requires "allocator_api"):
// To avoid resizing, we create these `Vec`s with the maximum capacity
// we want them ever to have. Resizing would waste memory, since bump
// allocators don't reclaim or reuse memory until the entire allocator
// is dropped.
let mut vec1: Vec<u32, _> = Vec::with_capacity_in(8, &bump);
let mut vec2: Vec<u32, _> = Vec::with_capacity_in(4, &bump);
for i in 0..4 {
    vec1.push(i * 2);
    vec1.push(i * 2 + 1);
    vec2.push(i * 2);
}

assert_eq!(vec1, [0, 1, 2, 3, 4, 5, 6, 7]);
assert_eq!(vec2, [0, 2, 4, 6]);

丢弃

Bump 可以返回原始内存(参见 Bump::allocate)或分配特定类型的值并返回一个引用(参见 Bump::alloc_valueBump::try_alloc_value)。在后一种情况下,如果返回引用,请注意析构函数将不会自动运行。如果这是一个问题,您可以执行以下操作之一

  • 手动删除这些值,使用 ptr::drop_in_place
  • 启用 allocator_api 功能,允许您使用 bump 分配器与各种数据结构(如 BoxVec)一起使用。注意,这需要 Rust nightly 版本。

请注意,与其他 bump 分配器一样,分配对象使用的内存将在整个 bump 分配器被删除之前不会回收或重用。

包功能

如果启用了包功能 allocator_api,则不稳定 Allocator 特性将为 T&Tcrate::Rc<T> 实现,其中 TBumpDynamicBump。这使得您可以将这些类型用作各种数据结构(如 BoxVec)的分配器。注意,此功能需要 Rust nightly 版本。或者,如果启用了功能 allocator-fallback,则此包将使用 allocator-fallback 提供的分配器 API 而不是标准库的。

依赖项