#heap-allocation #rc #collect #arc #needing #trying #iterator-item-t

collect_into_rc_slice

一个 crate,允许您将一个 Iterator<Item=T> 收集到一个 Rc<[T]>Arc<[T]> 中,而不需要进行两次堆分配

1 个稳定版本

1.0.0 2023年8月2日

#690内存管理

MIT 许可证

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来识别可能的不确定行为。

没有运行时依赖