当整个 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 可以移动它的内容吗?的主要内容,如果未能解决你的问题,请参考以下文章

栅格布局的理解

div随鼠标移动

使用 Jquery 一键移动对应的 div

H5移动端知识点总结

关于移动端输入键盘遮挡页面

margin-top超出所在盒子范围