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

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

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

我错过什么了吗?

推荐答案

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

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


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

计数器通过执行Drop而减少,Drop相当于一个析构函数.这个drop()函数在变量超出范围时执行,这非常符合我们的目标.

但是我们什么时候做增量呢?你猜对了:clone()年.根据定义,The Copy trait表示只需复制位就可以复制类型:

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

这在我们的例子中是不正确的,因为:是的,我们"只是复制位",但我们也做额外的工作!我们确实需要增加我们的参考计数器!

Rust相关问答推荐

如何将元素添加到向量并返回对该元素的引用?

两个相关特征的冲突实现错误

在Rust中赋值变量有运行时开销吗?

为什么允许我们将可变引用转换为不可变引用?

如何格式化传入Rust中mysql crate的Pool::new的字符串

integer cast as pointer是什么意思

如何修复&q;无法返回引用函数参数的值在异步规则中返回引用当前函数&q;拥有的数据的值?

我如何使用AWS SDK for Rust获取我承担的角色的凭据?

如何在Rust中基于字符串 Select struct ?

为什么 vec![Vec::with_capacity(n)] 为子向量创建 0 容量?

详尽的匹配模式绑定

我可以用 Rust 编写一个不可变变量

‘&T as *const T as *mut T’ 在 ‘static mut’ 项目中合适吗?

Rust 中的 Option as_ref 和 as_deref 有什么不同

borrow 匹配手臂内部的可变

rust 中不同类型的工厂函数

为什么允许重新分配 String 而不是 *&String

使用泛型作为关联类型,没有幻像数据

Rust 中的运行时插件

在 Rust 中组合特征的不同方法是否等效?