有人能解释一下为什么Rc<>
不是Copy
吗?
我正在编写使用大量共享指针的代码,而且必须一直键入.clone()
让我感到不安.
在我看来,Rc<>
应该只是由一个指针组成,指针的大小是固定的,所以类型本身应该是Sized
,因此应该是Copy
,对吗?
我错过什么了吗?
有人能解释一下为什么Rc<>
不是Copy
吗?
我正在编写使用大量共享指针的代码,而且必须一直键入.clone()
让我感到不安.
在我看来,Rc<>
应该只是由一个指针组成,指针的大小是固定的,所以类型本身应该是Sized
,因此应该是Copy
,对吗?
我错过什么了吗?
在我看来,
Rc<>
应该只是由一个指针组成,指针的大小是固定的,所以类型本身应该是Sized
,因此应该是Copy
,对吗?
事实并非如此.Rc
是R参考C计数的缩写.这意味着该类型会跟踪有多少引用指向所拥有的数据.这样,一旦引用计数达到0,我们就可以同时拥有多个所有者,并安全地释放数据.
但我们如何保持参考计数器的有效性和最新性?确切地说,无论何时创建新的引用/所有者,还是何时删除引用/所有者,我们都必须做一些事情.具体来说,我们必须在前一种情况下增加计数器,在后一种情况下减少计数器.
计数器通过执行Drop
而减少,Drop
相当于一个析构函数.这个drop()
函数在变量超出范围时执行,这非常符合我们的目标.
但是我们什么时候做增量呢?你猜对了:clone()
年.根据定义,The Copy
trait表示只需复制位就可以复制类型:
只需复制位(即
memcpy
位)即可复制的类型.
这在我们的例子中是不正确的,因为:是的,我们"只是复制位",但我们也做额外的工作!我们确实需要增加我们的参考计数器!