11个不稳定版本

0.6.1 2022年10月28日
0.5.0 2021年10月24日
0.4.1 2021年7月3日

340内存管理 中排名

每月下载量 39
用于 encase

MIT/Apache

89KB
1.5K SLoC

StaticRc 是一个安全的引用计数指针,类似于 RcArc,但它在编译时而不是运行时进行引用计数,因此避免了大部分运行时开销。

动机示例

像链表、二叉树或B树这样的集合最容易使用别名指针实现。

传统上,这需要使用 unsafe 原始指针,或者根据情况使用 RcArc。然而,一个关键的观察结果是,在这些集合中,别名数在编译时是已知的

  • 双链表每个节点有2个指针。
  • 二叉树每个节点有3个指针:一个来自父节点,一个来自每个子节点。
  • 基数N的B树每个节点有N+1个指针。

在这种情况下,static-rc 提供了与 RcArc 相同的安全性和性能,同时具有与 unsafe 原始指针相同的性能。

目标

提供安全和高效的引用计数

  • 效率:大多数相关函数简化为复制一个 NonNull<T>,这是一个简单的操作。
    • 一个关键例外是 join 函数:必须进行运行时检查以确保要连接的实例引用相同的指针。如果开销过高,则提供不可安全检查的变体。
  • 安全性:大多数相关函数使用安全。
    • 一些不可安全函数是严格可选的。

成熟度

这个包仍然非常实验性。

审查

  • 审查最少。
  • 未审计。
  • 没有正式证明。

文档

  • 所有 StaticRc 相关函数都有文档,并附带示例。
  • 所有 StaticRcRef 相关函数都有文档,并附带示例。

测试

  • 所有编译时断言都使用编译失败测试进行了测试。
  • 所有panic都经过panic测试。
  • Miri在测试套件中运行,没有任何抱怨。

调试检查

此库在构建时包含了许多额外的检查,特别是对于debug_assertionsDrop实现将捕获对StaticRc的任何破坏尝试,其中StaticRc<T, N, D>的N小于D,因为这通常会引发内存泄漏。

这些检查对安全性并非绝对必要,它们包括在内是为了帮助指出逻辑错误。

根据经验,在广泛的测试套件上进行的Drop检查将有助于捕捉那些路径意外释放指针的所有实例。

就是这样!

感谢阅读。

无运行时依赖

特性