如何通过Rc::clone(&pointer)增加引用计数?

3

我看不懂下面的代码应该如何实现:

let a = Rc::new(5);
let b = Rc::clone(&a);
let c = Rc::clone(&a);

Rc::clone接受一个不可变引用a,但却成功地增加了它的引用计数(这需要可变引用?)。

我尝试检查Rc的源代码(请参见此处),但由于我当前知识有限,无法理解其中的内容。

这是否是因为它在底层使用了unsafe代码,还是其他原因?

2个回答

7
在底层,Rc使用Cell,它使内部可变性成为可能。
struct RcBox<T: ?Sized> {
    strong: Cell<usize>,
    weak: Cell<usize>,
    value: T,
}

最终,所有的路都通向Cell::replace。不可避免地,它里面包含一个unsafe块:

mem::replace(unsafe { &mut *self.value.get() }, val)

所以,是的,你的直觉是正确的!

4

非常感谢您如此迅速的回答!可惜我不能同时接受两个答案。 - Ivan Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接