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 次下载
50KB
536 行
fixed-bump
一个 bump 分配器(如 bumpalo),其内部使用固定大小的内存块。
其他 bump 分配器,如 bumpalo,针对吞吐量进行了优化:它们使用指数增长的内存块大小进行分配,从而实现摊销常数时间的分配。
fixed-bump 针对延迟进行了优化:它内部使用固定、可配置大小的内存块进行分配,并且单个值分配以非摊销常数时间执行。然而,使用此 crate 的权衡是,如果指定的块大小或对齐太小时,它可能无法分配某些类型或内存布局。请参阅 Bump::allocate
了解可能失败的条件。
此 crate 仅依赖于 core
和 alloc
,因此它可以用于支持 alloc
的 no_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_value
和 Bump::try_alloc_value
)。在后一种情况下,如果返回引用,请注意析构函数将不会自动运行。如果这是一个问题,您可以执行以下操作之一
- 手动删除这些值,使用
ptr::drop_in_place
。 - 启用
allocator_api
功能,允许您使用 bump 分配器与各种数据结构(如Box
和Vec
)一起使用。注意,这需要 Rust nightly 版本。
请注意,与其他 bump 分配器一样,分配对象使用的内存将在整个 bump 分配器被删除之前不会回收或重用。
包功能
如果启用了包功能 allocator_api
,则不稳定 Allocator
特性将为 T
、&T
和 crate::Rc<T>
实现,其中 T
是 Bump
或 DynamicBump
。这使得您可以将这些类型用作各种数据结构(如 Box
和 Vec
)的分配器。注意,此功能需要 Rust nightly 版本。或者,如果启用了功能 allocator-fallback
,则此包将使用 allocator-fallback 提供的分配器 API 而不是标准库的。