小编Yan*_*eao的帖子

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

在下面的例子中:

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);
}
Run Code Online (Sandbox Code Playgroud)

我发现在传入函数之前和之后foo,地址f是不同的.为什么Rust会在任何地方复制这么大的结构但实际上不会移动它(或实现这种优化)?

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

rust

7
推荐指数
1
解决办法
241
查看次数

标签 统计

rust ×1