#rc #reference #arc #thread

无 std 可映射-rc

提供可映射的引用计数类型

2 个版本

0.1.1 2023年2月28日
0.1.0 2022年1月22日

541内存管理 中排名

Download history 2110/week @ 2024-03-14 2010/week @ 2024-03-21 1913/week @ 2024-03-28 2045/week @ 2024-04-04 1912/week @ 2024-04-11 2051/week @ 2024-04-18 1669/week @ 2024-04-25 1651/week @ 2024-05-02 1852/week @ 2024-05-09 1981/week @ 2024-05-16 1335/week @ 2024-05-23 2014/week @ 2024-05-30 1873/week @ 2024-06-06 1942/week @ 2024-06-13 2211/week @ 2024-06-20 1246/week @ 2024-06-27

每月下载量 7,702
8 个 Crates 中使用 (通过 golem-wasm-ast)

MIT/Apache

22KB
336

提供可映射的 RcArc 类型。

use mappable_rc::Mrc;

let m: Mrc<[u32]> = vec![1, 2, 3, 4].into();
assert_eq!(m.as_ref(), &[1, 2, 3, 4]);

let m: Mrc<[u32]> = Mrc::map(m, |slice| &slice[1..=2]);
assert_eq!(m.as_ref(), &[2, 3]);

lib.rs:

提供可映射的 RcArc 实现。

此crate提供两种类型:[Marc] 和 [Mrc],对应于 std 的 [Arc] 和 [Rc] 类型。这些类型在大多数情况下都是即插即用的替代品;它们还通过引用计数提供共享所有权、许多相同的方法以及几乎所有的相同特实现。关键区别是这两种类型都存在 map 方法。例如,您可以使用 Mrc::map 来子切片一个 Mrc<[u32]>

use mappable_rc::Mrc;

let m: Mrc<[u32]> = vec![1, 2, 3, 4].into();
assert_eq!(m.as_ref(), &[1, 2, 3, 4]);

let m: Mrc<[u32]> = Mrc::map(m, |slice| &slice[1..=2]);
assert_eq!(m.as_ref(), &[2, 3]);

map 函数不需要保留类型。例如

use mappable_rc::Mrc;

struct S(u32);

let m: Mrc<S> = Mrc::new(S(5));
let inner: Mrc<u32> = Mrc::map(m, |s| &s.0);

assert_eq!(inner.as_ref(), &5);

即使其他代码给您提供了一个 RcArc,您也可以使用此crate提供的类型。请参阅 Mrc::from_rcMarc::from_arc 方法,以及相应的 From 实现。

性能

此crate中类型的性能与相应的 std 类型非常相似。数据指针直接存储在结构中,因此引用的数据仅有一层间接。内部实现 Marc 重新使用了 stdArc,因此原子操作预计效率不会更高或更低。

这个crate中许多特性实现比相应的std实现更高效。Mrc<[T]>: From<Vec<T>>是这样实现的

use mappable_rc::Mrc;

let v = vec![1; 1000];
let m: Mrc<Vec<i32>> = Mrc::new(v);
let m: Mrc<[i32]> = Mrc::map(m, |v| &v[..]);

这意味着Vec中的数据永远不会被复制,只进行少量的内存分配。对于Arc<[T]>的相同实现将复制Vec的数据,以确保内存格式符合Arc的更严格要求。

这些类型的主要性能缺点是MrcMarc的大小比相应的std类型大两个usize

#![no_std]

默认情况下,这个crate是#![no_std],但当然依赖于alloc。有一个非默认的std特性,提供了std::error::ErrorFrom<OsString>From<PathBuf>的实现。激活此特性将引入一个std依赖。

这个crate没有其他依赖。

无运行时依赖

特性