#rc #arc #no-std

no-std rclite

小型、快速且内存友好的引用计数,与 Arc 和 Rc API 兼容

8 个版本

0.2.4 2023 年 6 月 4 日
0.2.3 2023 年 5 月 17 日
0.2.2 2023 年 3 月 4 日
0.2.1 2023 年 2 月 23 日
0.1.5 2023 年 2 月 18 日

#144并发

Download history 168/week @ 2024-03-25 364/week @ 2024-04-01 536/week @ 2024-04-08 273/week @ 2024-04-15 175/week @ 2024-04-22 206/week @ 2024-04-29 222/week @ 2024-05-06 209/week @ 2024-05-13 233/week @ 2024-05-20 266/week @ 2024-05-27 171/week @ 2024-06-03 262/week @ 2024-06-10 244/week @ 2024-06-17 208/week @ 2024-06-24 236/week @ 2024-07-01 157/week @ 2024-07-08

每月 933 次下载
用于 12 个 Crates (6 个直接)

MIT/Apache

55KB
571

RcLite:小型、快速且内存友好的引用计数

Crates.io Documentation MIT licensed Apache 2 licensed

RcLite 是 Rust 的轻量级引用计数解决方案,可作为标准库引用计数的替代品。它提供多线程和单线程引用计数选项,具有改进的性能和降低的内存开销,与标准库引用计数相比,内存开销至少降低 50%,最高降低 100%。当不需要弱引用且优化性能和内存使用是优先考虑时,RcLite 是一个合适的选择。

为什么使用 RcLite?

  • 它更快、更小
  • 占用更少内存
  • 它为标准库的 std::sync::Arcstd::rc::Rc 提供轻量级的替代方案
  • 它支持使用 extern alloc 的 no_std

为什么不适合使用 RcLite?

  • 它不提供弱引用
  • 它不支持数据作为 DSTs
  • 在 64 位系统上使用 RcLite,您只能对一个对象有 4,294,967,296 - 256 个活动引用,这需要大约 32GB 的内存来存储对单个对象位置的这些引用。如果您需要对一个对象有 18,446,744,073,709,551,616 个活动引用,请使用标准库。在其他具有较小指针大小(如 32 位)的系统上,您将面临与标准库相同的 usize::MAX 活动引用限制。

比较

rclite::{Arc,Rc} std::*::{Arc,Rc}
64 位系统中的开销 4 字节 16 字节
32位系统中的开销 4或2字节 8字节
16位系统中的开销 2或1字节 4 字节
弱引用
DST支持

在64位系统中,RcLite相对于标准库中的Arc具有优势,因为它可以利用内存填充区域,仅使用4字节来存储计数器。这导致内存使用量减少,因为填充上的内存浪费更少。然而,在结构中可用填充不足的情况下,RcLite的开销为8字节,这仍然是标准库开销的一半。

例如,在64位系统中,Rc<u32>Arc<u32>分配的内存与Box<u32>相同,因为分配器会将Box<u32>填充为u64

在32位和16位系统中,RcLite的内存开销是标准库的50%。

RcLite的结构类似于一个Box<(T,counter)>,其中计数器存储在数据之后,而不是像标准库中的第一个字段。这消除了访问数据时进行指针计算的需要,但也限制了RcLite对DST的支持。

特性

默认情况下,RcLite使用64位系统的半个字大小的计数器大小,启用了usize-for-small-platforms特性。这是因为32位计数器溢出的难度比16位计数器大。如果您希望在其他平台上使用半个寄存器大小,可以通过设置default-features = false来禁用默认特性。这将导致32位平台上使用16位计数器,16位平台上使用8位计数器。

依赖项