为什么的std :: RC:RC <>不能复制?

问题描述 投票:17回答:2

谁能给我解释一下为什么Rc<>Copy

我正在写使用了大量的共享指针的代码,并且不必键入.clone()所有的时间都让我心烦。

在我看来,那Rc<>应该只是由一个指针,它的大小是固定的,所以类型本身应该是Sized因此Copy,对不对?

我缺少的东西吗?

rust smart-pointers
2个回答
28
投票

在我看来,那Rc<>应该只是由一个指针,它的大小是固定的,所以类型本身应该是Sized因此Copy,对不对?

这是不完全正确。 Rc是短期的引用计数。这意味着该类型跟踪多次提到如何指向拥有的数据。这样,我们就可以同时拥有多个业主和安全释放数据,一旦引用计数为0。


但是,我们如何保持引用计数器有效且最新的吗?没错,我们必须做一些事情只要创建一个新的参考/所有者和当提到/所有者将被删除。具体来说,我们必须增加在前者的情况下计数器,并在后者减少它。

该计数器通过实施Drop,锈等效析构函数的降低。非常适合我们的目标 - 当一个变量超出范围时,执行该drop()功能。

但是做的时候,我们做增量?你猜对了:在clone()The Copy trait,顾名思义,说一个类型可以仅仅通过复制位被复制:

可以通过简单地复制位被复制类型(即memcpy)。

这是不正确的在我们的情况,这是因为:是的,我们“只是复制位”,但我们也做其他工作!我们确实需要增加我们的引用计数!


8
投票

A型无法实现Copy是否实现Dropsource)。由于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

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