我正在编写一些使用 Rc 的代码
这是我认为正在发生的事情的图表(不完全是 Rust 如何形成结构,只是一个近似值)
-Rc----------- -String------
my_var --> | ptr | --> | ptr | --> str
| weak_ref | | length |
| strong_ref | | capacity |
-------------- -------------
我遇到了 this 解决方案,它使用
Rc<str>
来减少额外的指针间接寻址。但是当我尝试使用 Rc::unwrap_or_clone(my_string)
时,编译器会给出一条消息,说明在编译时如何无法知道 my_string
的大小。但在我的用例中,该字符串是动态构造的,因此在编译时不可能知道其大小。我认为使用 Rc<&str>
也不起作用,因为它是一个参考。另外,当它放入结构中时,需要有一个生命周期,我真的不想处理它。
我也遇到过一个相关的东西,它制作了一个RcStr结构,但他们使用
Rc<String>
来存储底层数据,这并不能避免额外的指针间接寻址。
我正在寻找的是某种方法以某种方式自动将
Rc
和 String
结构合并在一起,如下所示:
struct Merged {
data: *mut u8, // from string
len: usize,
cap: usize,
strong_ref: usize, // from rc
weak_ref: usize,
}
这可能吗?或者还有其他解决方案来解决额外的间接问题吗?
感谢评论,我重构了我的代码,不使用
unwrap_or_clone()
函数。我选择将 Rc
转换为参考,然后称为 .to_string()
。这非常适合我的用例。