为什么std :: rc :: Rc <>不能复制?

rix*_*rrr 19 smart-pointers rust

有人可以向我解释为什么Rc<>不是Copy吗?

我正在编写使用大量共享指针的代码,并且不得不一直打字,.clone()这让我很紧张.

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

我错过了什么吗?

Luk*_*odt 30

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

这不是真的.RcR eference C的缩写.这意味着该类型会跟踪有多少引用指向拥有的数据.这样,一旦引用计数达到0,我们可以同时拥有多个所有者并安全地释放数据.


但是,我们如何保持参考计数器有效并保持最新状态?确切地说,每当创建新的引用/所有者以及删除引用/所有者时,我们都必须执行某些操作.具体来说,我们必须在前一种情况下增加计数器,在后一种情况下减少计数器.

通过实现DropRust的等效析构函数来减少计数器.drop()只要变量超出范围,就会执行此功能 - 这完全符合我们的目标.

但我们什么时候做增量?你猜对了:in clone().根据Copy定义,特征表示只需复制位即可复制类型:

只需复制位即可复制的类型(即memcpy).

在我们的情况下,情况并非如此,因为:是的,我们"只是复制位",但我们还做了额外的工作!我们确实需要增加参考计数器!

  • 还有逻辑参数:对于引用计数指针,您希望能够区分何时创建新指针,或何时将指针赋予其他内容。“复制”将消除这种区别。 (2认同)

lje*_*drz 10

如果类型Copy实现Drop(),则无法实现.由于Rc 实现它以减少其引用计数,因此不可能.

另外,Rc不仅仅是一个指针.它包括Shared:

pub struct Rc<T: ?Sized> {
    ptr: Shared<RcBox<T>>,
}
Run Code Online (Sandbox Code Playgroud)

反过来,这不仅仅是一个指针:

pub struct Shared<T: ?Sized> {
    pointer: NonZero<*const T>,
    _marker: PhantomData<T>,
}
Run Code Online (Sandbox Code Playgroud)

PhantomData需要表达以下所有权T:

这个标记对方差没有影响,但是对于理解我们逻辑上拥有a而言是必要的T.

有关详细信息,请参阅:https: //github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md#phantom-data