#arena #memory #object #bump-allocator

nightly hato

异构对象特性和对象区域

3个不稳定版本

0.2.1 2024年5月21日
0.2.0 2024年5月21日
0.1.0 2024年5月19日

#655 in 内存管理

Download history 90/week @ 2024-05-13 307/week @ 2024-05-20 3/week @ 2024-06-10

每月下载量 62

MIT 许可证

15KB
139

hato

异构对象特性和对象区域。

这个集合绑定到一个用户特性,元素以特性对象的形式检索。这是一个对 Vec<Box<dyn Trait>> 的替代品,不需要为每个条目进行一次分配。像 bumpalo 这样的 bump 分配器将带来类似的好处,但不会提供内存回收的方法。这对于涉及交替插入和删除的工作负载可能会有限制。

元素必须实现 Unscrupulous 特性,这使得区域克隆变得快速,每个存储在集合中的对象类型只需要几 memcpy 调用。请注意,这非常限制性;确保您的类型满足 要求

典型用法如下

// Initialize the collection
let mut arena = hato::Hato::<dyn core::fmt::Debug>::default();

// Insert a elements of different types that all implement our trait
let x = arena.push(4_u16);
let y = arena.push(2_i32);

// We use the handles to access the trait objects
assert_eq!(format!("{:?}", arena.get(x)), "4");
assert_eq!(format!("{:?}", arena.get(y)), "2");

// We can remove individual elements...
arena.remove(x);

// ... and re-use the underlying capacity
let _z = arena.push(7_u16);

注意事项

  • 此crate需要不稳定功能,如果您不能使用nightly,请保持版本0.1.0。
  • Hato 按其虚拟表分组对象,这在 代码生成单元之间是复制的。使用 codegen-units = 1 可以减少单独区域的数量,这可能是有价值的。
  • 此集合受 ABA问题 的影响。有关更多详细信息,请参阅 类型文档

致谢

非常感谢 @bluurryy!如果没有他们的技能和时间,这个crate将保持一个混乱、难以驾驭、非泛型、不直观的宏。

依赖项

~0.4–0.8MB
~20K SLoC