Rust的示例網站上提供了Rust的移動語義示例:Rust Move Semantics。Rust如何移動不可複製的堆棧變量?
我對這兩種情況都有基本的瞭解。首先是一個原語如何可以有一個新的別名,原始仍然可以使用,因爲最終的結果是一個複製看到i32
利用Copy
特質。這對我來說很有意義。
此外,出於許多充分的理由,第二個示例在堆中具有多個引用i32
的別名方面是有意義的。 Rust實施所有權規則,因此在創建新綁定後,原始別名不能使用。這有助於防止數據競爭,雙重釋放等。
但是,似乎還有第三種情況沒有提及。 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);
}
這個我知道:在上面的情況下,鏽病將分配堆棧上Employee
。上述結構未實現Copy
特性,因此在分配給新別名時不會被複制。這對我來說非常混亂,因爲如果Employee
結構被分配到堆棧上,並且沒有實現Copy
這個特性/它如何移動?它是否物理上移動到do_something()
的堆棧框架?
任何幫助,解釋這個難題讚賞。
你介意簡化你的例子嗎?將'Employee'結構變得更加複雜並且至少移除生命週期會很好。例如,'struct Employee {age:i32}'就足夠了。 –
@LukasKalbertodt - 是的,我簡化了這個例子。 –