这里有一个很好的 Rust 移动语义示例:Rust By Example 网站上的Rust Move Semantics 。
我对这两种情况都有基本的了解。第一个是原语如何具有新的别名并且仍然可以使用原始别名,因为最终结果是副本视为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);
}
我知道:在上述情况下,Rust 将Employee
在堆栈上分配。上述结构没有实现Copy
特征,因此在分配给新别名时不会被复制。这让我很困惑,因为如果Employee
结构在堆栈上分配并且也没有实现Copy
特征它在哪里/如何移动?它物理上是否移动到do_something()
的堆栈帧?
感谢您在解释这个难题时提供任何帮助。