有人能解释一下为什么Rc<>不是Copy吗?
我正在编写使用大量共享指针的代码,而且不得不一直键入.clone(),这让我感到不安。
在我看来,Rc<>应该只是由一个指针组成,指针是一个固定的大小,所以类型本身应该是Sized,因此应该是Copy,对吗?
我是不是遗漏了什么?
发布于 2016-10-13 07:29:23
在我看来,
Rc<>应该只是由一个指针组成,指针是一个固定的大小,所以类型本身应该是Sized,因此应该是Copy,对吗?
这不是完全正确的。Rc是Reference C的缩写。这意味着该类型跟踪指向所拥有数据的引用的数量。这样,一旦引用计数达到0,我们可以同时拥有多个所有者并安全地释放数据。
但是,我们如何保持参考计数器有效和最新?确切地说,每当创建新的引用/所有者和删除引用/所有者时,我们都必须做一些事情。具体来说,在前一种情况下,我们必须增加计数器,而在后一种情况下,我们必须减少计数器。
通过实现Drop来减少计数器,这是一个析构函数的锈蚀等效。每当变量超出作用域时,这个drop()函数就会被执行--对我们的目标来说是完美的。
但是我们什么时候做增量呢?您猜到了:在clone()中。特性从定义上说,只需复制位,就可以复制类型:
可以通过简单复制位(即
memcpy)来复制的类型。
这在我们的情况下是不正确的,因为:是的,我们“只是复制位”,但我们也做额外的工作!我们确实需要增加我们的参考计数器!
发布于 2016-10-13 07:37:06
如果一个类型实现了Copy ( Drop (来源) ),它就不能实现它。由于Rc 是否实施?要减少其引用计数,因此不可能。
此外,Rc不仅仅是一个指针。它由一个Shared组成
pub struct Rc<T: ?Sized> {
ptr: Shared<RcBox<T>>,
}反过来,它不仅仅是一个指针:
pub struct Shared<T: ?Sized> {
pointer: NonZero<*const T>,
_marker: PhantomData<T>,
}需要PhantomData来表示T的所有权:
这个标记对方差没有任何影响,但是对于dropck来说,理解我们逻辑上拥有一个
T是必要的。 有关详细信息,请参阅:https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md#phantom-data
https://stackoverflow.com/questions/40014703
复制相似问题