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没有其他依赖。