11个不稳定版本
0.6.1 | 2022年10月28日 |
---|---|
0.5.0 | 2021年10月24日 |
0.4.1 | 2021年7月3日 |
340 在 内存管理 中排名
每月下载量 39
用于 encase
89KB
1.5K SLoC
StaticRc
是一个安全的引用计数指针,类似于 Rc
或 Arc
,但它在编译时而不是运行时进行引用计数,因此避免了大部分运行时开销。
动机示例
像链表、二叉树或B树这样的集合最容易使用别名指针实现。
传统上,这需要使用 unsafe
原始指针,或者根据情况使用 Rc
或 Arc
。然而,一个关键的观察结果是,在这些集合中,别名数在编译时是已知的
- 双链表每个节点有2个指针。
- 二叉树每个节点有3个指针:一个来自父节点,一个来自每个子节点。
- 基数N的B树每个节点有N+1个指针。
在这种情况下,static-rc
提供了与 Rc
和 Arc
相同的安全性和性能,同时具有与 unsafe
原始指针相同的性能。
目标
提供安全和高效的引用计数
- 效率:大多数相关函数简化为复制一个
NonNull<T>
,这是一个简单的操作。- 一个关键例外是
join
函数:必须进行运行时检查以确保要连接的实例引用相同的指针。如果开销过高,则提供不可安全检查的变体。
- 一个关键例外是
- 安全性:大多数相关函数使用安全。
- 一些不可安全函数是严格可选的。
成熟度
这个包仍然非常实验性。
审查
- 审查最少。
- 未审计。
- 没有正式证明。
文档
- 所有
StaticRc
相关函数都有文档,并附带示例。 - 所有
StaticRcRef
相关函数都有文档,并附带示例。
测试
- 所有编译时断言都使用编译失败测试进行了测试。
- 所有panic都经过panic测试。
- Miri在测试套件中运行,没有任何抱怨。
调试检查
此库在构建时包含了许多额外的检查,特别是对于debug_assertions
,Drop
实现将捕获对StaticRc
的任何破坏尝试,其中StaticRc<T, N, D>
的N小于D,因为这通常会引发内存泄漏。
这些检查对安全性并非绝对必要,它们包括在内是为了帮助指出逻辑错误。
根据经验,在广泛的测试套件上进行的Drop
检查将有助于捕捉那些路径意外释放指针的所有实例。
就是这样!
感谢阅读。