6 个版本
0.3.2 | 2023年6月26日 |
---|---|
0.3.1 | 2022年9月13日 |
0.3.0 | 2022年6月25日 |
0.2.2 | 2022年6月21日 |
0.1.1 |
|
#153 in 数据结构
467 每月下载量
用于 4 个 crate(通过 maitake-sync)
220KB
3.5K SLoC
cordyceps
🍄 Mycelium 侵入式数据结构库。
这是什么?
此库提供了一组最初为 Mycelium 操作系统实现的数据结构集合。目前,它提供了一个 侵入式双向链表 和一个 侵入式、无锁 MPSC 队列。
侵入式数据结构
侵入式数据结构 是基于节点且节点数据(指向其他节点和可能的任何关联元数据)存储在数据结构内部,而不是拥有这些值的数据结构。
何时应该使用侵入式数据结构?
- 由于节点数据存储在集合的元素内部,因此不需要为这些节点进行额外的堆分配。这意味着当元素已经堆分配时,它可以添加到集合中,而无需额外的分配。
- 同样,当元素位于固定的内存位置(如页面分配器中的页面或
static
)时,可以将其添加到侵入式数据结构中,而无需分配 任何 资源。这使得侵入式数据结构在不能分配的代码中非常有用——例如,我们可能会使用内存区域列表来实现堆分配器。 - 侵入式数据结构可能比其他链式或基于节点的数据结构提供更好的性能,因为可以避免分配器的开销。
何时不应使用侵入式数据结构?
- 侵入式数据结构要求存储在集合中的元素要 意识到 集合。如果要将一个
struct
存储在侵入式集合中,则需要在该结构中存储一个Links
结构体作为字段,并实现Linked
特性,以便侵入式数据结构可以访问其Links
。 - 给定类型的
Linked
实例不能添加到多个同一类型的侵入式数据结构中。有时可以通过多个包装类型来解决这个问题。一个对象可以同时是多个不同类型的侵入式数据结构的一个成员。 - 使用侵入式数据结构需要
unsafe
代码。由于实现Linked
需要维护额外的不变性,因此Linked
特性是不安全的。特别是,侵入式集合的成员必须在内存中固定;在链接到侵入式集合时,它们不能移动(或被丢弃)。
关于名称
遵循 Mycelium 的真菌命名主题,Cordyceps 是一种子囊菌真菌,因其侵入性行为而(不)闻名。
功能
以下功能可用(此列表不完整;您可以通过 扩展它 来帮助。)
功能 | 默认值 | 说明 |
---|---|---|
no-cache-pad |
false |
禁止对用于许多链表指针的 CachePadded 结构进行缓存填充。当此功能未启用时,大小将根据目标平台确定。 |
alloc |
false |
启用 liballoc 依赖和依赖于 liballoc 的功能。 |
std |
false |
启用 libstd 依赖和依赖于 Rust 标准库的功能。隐含 alloc 。 |
依赖
~0–27MB
~330K SLoC