首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::rc::Rc<>没有复制?

为什么std::rc::Rc<>没有复制?
EN

Stack Overflow用户
提问于 2016-10-13 07:22:19
回答 2查看 6K关注 0票数 35

有人能解释一下为什么Rc<>不是Copy吗?

我正在编写使用大量共享指针的代码,而且不得不一直键入.clone(),这让我感到不安。

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

我是不是遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-13 07:29:23

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

这不是完全正确的。RcReference C的缩写。这意味着该类型跟踪指向所拥有数据的引用的数量。这样,一旦引用计数达到0,我们可以同时拥有多个所有者并安全地释放数据。

但是,我们如何保持参考计数器有效和最新?确切地说,每当创建新的引用/所有者和删除引用/所有者时,我们都必须做一些事情。具体来说,在前一种情况下,我们必须增加计数器,而在后一种情况下,我们必须减少计数器。

通过实现Drop来减少计数器,这是一个析构函数的锈蚀等效。每当变量超出作用域时,这个drop()函数就会被执行--对我们的目标来说是完美的。

但是我们什么时候做增量呢?您猜到了:在clone()中。特性从定义上说,只需复制位,就可以复制类型:

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

这在我们的情况下是不正确的,因为:是的,我们“只是复制位”,但我们也做额外的工作!我们确实需要增加我们的参考计数器!

票数 55
EN

Stack Overflow用户

发布于 2016-10-13 07:37:06

如果一个类型实现了Copy ( Drop (来源) ),它就不能实现它。由于Rc 是否实施?要减少其引用计数,因此不可能。

此外,Rc不仅仅是一个指针。它由一个Shared组成

代码语言:javascript
复制
pub struct Rc<T: ?Sized> {
    ptr: Shared<RcBox<T>>,
}

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

代码语言:javascript
复制
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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40014703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档