首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么Rust中的" move“实际上并没有移动?

为什么Rust中的" move“实际上并没有移动?
EN

Stack Overflow用户
提问于 2018-11-25 08:31:02
回答 1查看 1.4K关注 0票数 13

在下面的示例中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Foo {
    a: [u64; 100000],
}

fn foo(mut f: Foo) -> Foo {
    f.a[0] = 99999;
    f.a[1] = 99999;
    println!("{:?}", &mut f as *mut Foo);

    for i in 0..f.a[0] {
        f.a[i as usize] = 21444;
    }

    return f;
}
fn main(){
    let mut f = Foo {
        a:[0;100000]
    };

    println!("{:?}", &mut f as *mut Foo);
    f = foo(f);
    println!("{:?}", &mut f as *mut Foo);
}

我发现在传入函数foo之前和之后,f的地址是不同的。为什么Rust到处复制这么大的结构,而不是真正地移动它(或实现这种优化)?

我了解堆栈内存是如何工作的。但有了Rust的所有权提供的信息,我认为可以避免复制。编译器不必要地将数组复制两次。这可能是对Rust编译器的优化吗?

EN

回答 1

Stack Overflow用户

发布于 2018-11-25 08:48:36

移动是一个memcpy,然后将源视为不存在。

你的大数组在堆栈上。这就是Rust的内存模型的工作方式:局部变量位于堆栈中。由于当函数返回时,foo的堆栈空间将消失,因此除了将内存复制到main的堆栈空间之外,编译器别无选择。

在某些情况下,编译器可以重新安排,以便可以省略移动(源和目标合并为一件事),但这是不能依赖的优化,特别是对于大的事情。

如果您不想复制这个巨大的数组,那么可以通过Box<[u64]>或简单地使用Vec<u64>在堆上分配它。

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

https://stackoverflow.com/questions/53465843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文