谁能给我解释一下为什么Rc<>
不Copy
?
我正在写使用了大量的共享指针的代码,并且不必键入.clone()
所有的时间都让我心烦。
在我看来,那Rc<>
应该只是由一个指针,它的大小是固定的,所以类型本身应该是Sized
因此Copy
,对不对?
我缺少的东西吗?
在我看来,那
Rc<>
应该只是由一个指针,它的大小是固定的,所以类型本身应该是Sized
因此Copy
,对不对?
这是不完全正确。 Rc
是短期的引用计数。这意味着该类型跟踪多次提到如何指向拥有的数据。这样,我们就可以同时拥有多个业主和安全释放数据,一旦引用计数为0。
但是,我们如何保持引用计数器有效且最新的吗?没错,我们必须做一些事情只要创建一个新的参考/所有者和当提到/所有者将被删除。具体来说,我们必须增加在前者的情况下计数器,并在后者减少它。
该计数器通过实施Drop
,锈等效析构函数的降低。非常适合我们的目标 - 当一个变量超出范围时,执行该drop()
功能。
但是做的时候,我们做增量?你猜对了:在clone()
。 The Copy
trait,顾名思义,说一个类型可以仅仅通过复制位被复制:
可以通过简单地复制位被复制类型(即
memcpy
)。
这是不正确的在我们的情况,这是因为:是的,我们“只是复制位”,但我们也做其他工作!我们确实需要增加我们的引用计数!
A型无法实现Copy
是否实现Drop
(source)。由于Rc
does implement it递减的引用计数,这是不可能的。
此外,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