如何避免 Rc<String> 额外的指针间接寻址?

问题描述 投票:0回答:1

我正在编写一些使用 Rc 的代码。我非常确定使用它会创建一个额外的指针间接寻址,其中有一个指向 Rc 的指针,其中有一个指向 String 的指针,这是一个指向其实际内容的胖指针。

这是我认为正在发生的事情的图表(不完全是 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,
}

这可能吗?或者还有其他解决方案来解决额外的间接问题吗?

string rust memory reference-counting
1个回答
0
投票

感谢评论,我重构了我的代码,不使用

unwrap_or_clone()
函数。我选择将
Rc
转换为参考,然后称为
.to_string()
。这非常适合我的用例。

© www.soinside.com 2019 - 2024. All rights reserved.