3个不稳定版本
0.2.1 | 2024年5月21日 |
---|---|
0.2.0 | 2024年5月21日 |
0.1.0 | 2024年5月19日 |
#655 in 内存管理
每月下载量 62
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