6个稳定版本
1.1.1 | 2021年4月26日 |
---|---|
1.1.0 | 2021年4月25日 |
1.0.3 | 2020年11月5日 |
1.0.1 | 2020年11月4日 |
0.0.0 |
|
#1184 in 数据结构
在 charcoal 中使用
105KB
2K SLoC
Granite
构建堆分配数据结构的泛型支持存储框架。
概述
与其他许多语言不同,Rust 并不友好于基于智能指针的数据结构的简单实现。使用 Rc
/Arc
最多的只能表示一个 有向无环图 (DAG),而这个有些神秘的缩写中的第二个词暗示了原因:你会在指针之间遇到循环,这将阻止整个结构被丢弃,从而泄漏节点及其用户定义的内容的内存。唯一解决这个问题的方法是通过垃圾回收,或者通过手动丢弃每个元素,同时跟踪尚未丢弃的节点集合,这需要一个复杂的算法和运行时开销来匹配。
此外,为每个单独的元素执行单独的内存分配非常缓慢,并且对缓存局部性不友好,类似于普遍被厌恶的 LinkedList
。这就是Rust试图实现的零成本抽象的终结。
请看堆分配数据结构:一种使用 Vec
作为后端的数据结构,它提供了出色的缓存局部性和执行批量分配。
与智能指针数据结构不同,堆分配数据结构不存储任何指针。相反,它们存储键。键是后端存储中元素的标识符,在单个后端存储实例的范围内是唯一的。键可以在多个存储之间以及存在于某个时刻但已被删除的元素之间重叠,但它们不能在单个集合中同一时间共存的不同元素之间重叠。
公共依赖
tinyvec
—^1.2
arrayvec
—^0.5
smallvec
—^1.4
slab
—^0.4
slotmap
—^0.4
欢迎对此版本号修改感兴趣的PR。
功能标志
alloc
(默认启用) — 启用对标准库中的Vec
和VecDeque
的支持,同时保持no_std
包。需要功能性的全局分配器,但仅限运行时,而非编译时。tinyvec
— 启用对tinyvec
包中的ArrayVec
、SliceVec
和TinyVec
的支持,通常比arrayvec
和smallvec
更受欢迎。arrayvec
— 启用对ArrayVec
的支持。 建议使用tinyvec
。smallvec
— 启用对SmallVec
的支持。 建议使用tinyvec
。slab
— 启用对Slab
的支持。slotmap
— 启用对SlotMap
、HopSlotMap
和DenseSlotMap
的支持。Slab
可能会更快,因为它未版本化;此功能主要在这里用于兼容性。union_optimizations
— 转发到Granite,通过使用未标记联合体添加一些布局优化,减少SparseStorage
中的内存使用。 需要nightly编译器(见RFC 2514的跟踪问题),因此默认禁用。
依赖项
~180KB