当整个 Box 被移动时,Box 可以移动它的内容吗?
Posted
技术标签:
【中文标题】当整个 Box 被移动时,Box 可以移动它的内容吗?【英文标题】:Can Box move its contents when the whole Box is moved? 【发布时间】:2021-02-27 10:13:38 【问题描述】:如果我Box::new
一个值,获取指向它的指针(借用检查器不允许获取引用,因为我要移动框),然后移动Box
,可以值的移动(例如重新分配)发生了吗?
我认为Box
只存储值地址,因此移动Box
只会移动地址。因此,当其内容被不可变借用时,借用检查器禁止移动它有什么原因吗?
Playground
【问题讨论】:
移动框时内容不会移动,但如果借用检查器允许在框移动时引用框内容,则无法静态保证引用的有效性。跨度> @SvenMarnach 是的,但是为什么在移动盒子时它会抱怨?借位检查器不能区分盒子和里面的数据,这是指针后面的吗?可以有效地复制指针地址。 编辑:我误解了你评论的结尾。现在我明白了,问题可能是它不知道什么时候会丢弃数据。这可以防止预测您对内容的引用的生命周期。它可以保证的是,只要盒子不移动,引用就有效。 没错。借用检查器在本地处理各个功能。如果您将框移出当前功能,则借用检查器将无法再推断内容的生命周期。虽然可以使借用检查器比现在更通用,但它能够证明的内容存在理论上的限制。 【参考方案1】:不,移动 Box
不会移动堆中的值。
Box
做保证:
a
Box<T>
保证表示为单个指针
Rust 保证移动总是按位复制(如果它们完全复制的话)。
因此,当其内容被不可变地借用时,借用检查器是否有理由禁止移动它?
这包括:
Is there any way to allow moving a container that has a borrowed element but not dropping it? Why can't I store a value and a reference to that value in the same struct?【讨论】:
以上是关于当整个 Box 被移动时,Box 可以移动它的内容吗?的主要内容,如果未能解决你的问题,请参考以下文章