面试题答案
一键面试移动语义避免重复复制原理
在Rust中,像i32
这样的简单数据类型存储在栈上。当发生移动时,实际上是将所有权从一个变量转移到另一个变量,而不是进行数据的复制。这意味着资源(这里是栈上存储的i32
值)的所有权发生了变化,而数据本身并没有被复制,从而避免了重复复制带来的性能开销。
变量赋值中移动语义的体现
fn main() {
let a = 42;
let b = a; // a的所有权移动到b,此时a不再有效
// println!("a: {}", a); // 这行代码会报错,因为a的所有权已转移
println!("b: {}", b);
}
在上述代码中,let b = a;
语句将a
的所有权移动到b
,a
不再能被使用,这样避免了对42
这个i32
值的复制。
函数传参中移动语义的体现
fn take_i32(x: i32) {
println!("Got: {}", x);
}
fn main() {
let num = 10;
take_i32(num); // num的所有权移动到函数take_i32中的x
// println!("num: {}", num); // 这行代码会报错,因为num的所有权已转移
}
在这个例子中,num
作为参数传递给take_i32
函数,num
的所有权被移动到函数内部的x
,num
在函数调用后不再有效,同样避免了数据的重复复制。