2 个版本
| 0.1.1 | 2023年2月28日 |
|---|---|
| 0.1.0 | 2022年1月22日 |
541 在 内存管理 中排名
每月下载量 7,702
在 8 个 Crates 中使用 (通过 golem-wasm-ast)
22KB
336 行
提供可映射的 Rc 和 Arc 类型。
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:
提供可映射的 Rc 和 Arc 实现。
此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);
即使其他代码给您提供了一个 Rc 或 Arc,您也可以使用此crate提供的类型。请参阅 Mrc::from_rc 和 Marc::from_arc 方法,以及相应的 From 实现。
性能
此crate中类型的性能与相应的 std 类型非常相似。数据指针直接存储在结构中,因此引用的数据仅有一层间接。内部实现 Marc 重新使用了 std 的 Arc,因此原子操作预计效率不会更高或更低。
这个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的更严格要求。
这些类型的主要性能缺点是Mrc和Marc的大小比相应的std类型大两个usize。
#![no_std]
默认情况下,这个crate是#![no_std],但当然依赖于alloc。有一个非默认的std特性,提供了std::error::Error、From<OsString>和From<PathBuf>的实现。激活此特性将引入一个std依赖。
这个crate没有其他依赖。