1 个稳定版本
1.0.0 | 2023年8月2日 |
---|
#690 在 内存管理
23KB
371 行
collect_into_rc_slice
一个 crate,允许您将一个 Iterator<Item=T>
收集到一个 Rc<[T]>
或 Arc<[T]>
中,而不需要进行两次堆分配。
重要说明
如果您已经有一个包含您尝试转换到 Rc<[T]>
的确切块内存的 Vec<T>
、sString
或 &[T]
,请切勿使用此工具。
它不会比 std
实现做得更好。在这种情况下,最好使用 .into()
。
例如
use std::rc::Rc;
let v = vec![1,2,3];
let rc: Rc<[i32]> = v.into(); // Just use .into()
问题
您刚刚学习了如何酷炫地使用 Rc<[T]>
,您已经有一个 Iterator<Item=char>
,并且希望将其收集到 Rc<str>
有人可能会天真地这样做:
use std::rc::Rc;
let iter = "Hello, world!".chars();
let rc: Rc<str> = iter.collect::<String>().into();
这会产生两个单独的堆分配,一个用于 String
,另一个用于 Rc
解决方案
非常有可能会只用一个堆分配来完成这个操作,但这需要使用不安全的代码,并且需要很好地了解智能指针的内部数据结构。
使用这个crate,您可以避免另一个堆分配
use collect_into_rc_slice::*;
use std::rc::Rc;
let iter = "Hello, world!".chars(); // Some iterator
let rc: Rc<str> = iter.collect_into_rc_str();
安全性
这个crate使用不安全的代码来创建安全的抽象。为了确保其安全性,它经过了测试,并使用miri来识别可能的不确定行为。