ここに文書化された Rust の移動セマンティクスの優れた例があります: Rust By Example Web サイトのRust Move Semantics 。
私は両方のケースの基本的な理解を示しました。1 つ目は、プリミティブが新しいエイリアスを持つことができ、元のエイリアスを引き続き使用できる方法です。これは、最終結果がトレイトをi32
利用していると見なされるコピーであるためです。Copy
これは私には理にかなっています。
i32
さらに、多くの正当な理由により、2 番目の例は、ヒープ上のを参照する複数のエイリアスを持つという点で理にかなっています。Rust は所有権の規則を適用するため、新しいバインディングが作成されたので、元のエイリアスを使用することはできません。これにより、データ競合や二重解放などを防ぐことができます。
しかし、語られていない 3 番目のケースがあるようです。Rust は、トレイトを実装しないスタック割り当て構造体の移動をどのように実装しCopy
ますか? これを次のコードで示します。
#[derive(Debug)]
struct Employee{
age: i32,
}
fn do_something(m: Employee){
println!("{:?}", m);
}
fn main() {
let x = Employee {
age: 25,
};
do_something(x);
//compiler error below because x has moved
do_something(x);
}
これは私が知っていることです: 上記の場合、Rust は をEmployee
stackに割り当てます。上記の構造体は特性を実装していないCopy
ため、新しいエイリアスに割り当てられたときにコピーされません。Employee
構造体がスタックに割り当てられていて、トレイトを実装していない場合、どこCopy
に/どのように移動するのでしょうか? do_something()
のスタック フレームに物理的に移動しますか?
この難問を説明する上で、どんな助けも大歓迎です。