在下面的示例中:
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编译器的一种优化吗?
&
指示要传递引用的情况下转储到堆栈上。(在我的情况下,这是一个错误,在嵌入式系统中,有200K被转储到了16K的堆栈中。由于没有内存保护,几个其他堆栈也被擦除,系统很快就在无关代码中崩溃了。花了我几个小时找到单个缺失的&
) - starblue&
可以有很大的区别。传递变量的引用将共享相同的内存。但是没有&
,将使用复制构造函数(或简单复制)来创建参数变量(它与传递后的变量没有关联)。但是,在 C++ 中使用&&
和std::move
时会使用move
来触发移动构造函数。在被“移动”到函数中之后,该变量将无法使用。因此,C++ 中的移动几乎具有与 Rust 相同的语义(没有所有权系统提供的安全性),但性能不同。 - YangKeao