考虑片段
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);
}
典型的result个项目是
0x7fffc1239890
0x7fffc1229890
地址不同的地方.
显然,正如编译器的move实现所预期的那样,大数组dummy
已被复制.不幸的是,这可能会对性能产生不小的影响,因为dummy
是一个非常大的array.这种影响会迫使人们 Select 通过引用传递参数,即使函数实际上在概念上"消耗"了参数.
因为Foo
不派生Copy
,所以对象o
被移动.由于 rust 迹禁止访问移动的对象,是什么阻止bar
"重用"原始对象o
,迫使编译器生成可能昂贵的位拷贝?有没有一个根本性的困难,或者有一天我们会看到编译器优化掉这个逐位拷贝?