rix*_*rrr 19 smart-pointers rust
有人可以向我解释为什么Rc<>不是Copy吗?
我正在编写使用大量共享指针的代码,并且不得不一直打字,.clone()这让我很紧张.
在我看来,Rc<>应该只是一个指针,这是一个固定的大小,所以类型本身应该是Sized,因此Copy,对吗?
我错过了什么吗?
Luk*_*odt 30
在我看来,
Rc<>应该只是一个指针,这是一个固定的大小,所以类型本身应该是Sized,因此Copy,对吗?
这不是真的.Rc是R eference C的缩写.这意味着该类型会跟踪有多少引用指向拥有的数据.这样,一旦引用计数达到0,我们可以同时拥有多个所有者并安全地释放数据.
但是,我们如何保持参考计数器有效并保持最新状态?确切地说,每当创建新的引用/所有者以及删除引用/所有者时,我们都必须执行某些操作.具体来说,我们必须在前一种情况下增加计数器,在后一种情况下减少计数器.
通过实现DropRust的等效析构函数来减少计数器.drop()只要变量超出范围,就会执行此功能 - 这完全符合我们的目标.
但我们什么时候做增量?你猜对了:in clone().根据Copy定义,该特征表示只需复制位即可复制类型:
只需复制位即可复制的类型(即
memcpy).
在我们的情况下,情况并非如此,因为:是的,我们"只是复制位",但我们还做了额外的工作!我们确实需要增加参考计数器!
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
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |