スニペットを検討してください
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
コンパイラの move 実装で予想されるように、大きな配列がコピーされています。dummy
残念ながら、非常に大きな配列と同様に、これはパフォーマンスに重大な影響を与える可能性があります。この影響により、関数が実際に引数を概念的に「消費」している場合でも、人々は代わりに参照による引数の受け渡しを選択することを余儀なくされる可能性があります。
Foo
は を導出しないため、Copy
オブジェクトo
が移動されます。Rust は移動されたオブジェクトへのアクセスを禁止しているためbar
、元のオブジェクトの「再利用」を妨げているものは何o
ですか? 根本的な問題はありますか、それともコンパイラがこのビット単位のコピーを最適化する日が来るのでしょうか?