考虑片段
struct Foo {
dummy: [u8; 65536],
}
fn bar(foo: Foo) {
println!("{:p}", &foo)
}
fn main() {
let o = Foo { dummy: [42u8; 65536] };
println!("{:p}", &o);
bar(o);
}
该程序的典型结果是
0x7fffc1239890
0x7fffc1229890
地址不同的地方。
显然,大数组dummy
已被复制,正如编译器的移动实现中所预期的那样。不幸的是,这可能会产生不小的性能影响,就像dummy
一个非常大的数组一样。这种影响可能会迫使人们选择通过引用传递参数,即使函数实际上在概念上“消耗”了参数。
由于Foo
不派生Copy
,因此对象o
被移动。由于 Rust 禁止访问移动的对象,是什么阻止bar
了“重用”原始对象o
,从而迫使编译器生成潜在的昂贵的逐位副本?有没有根本的困难,或者我们有一天会看到编译器优化掉这个按位复制?