MST
星途 面试题库

面试题:Rust移动语义如何避免简单数据类型的重复复制

在Rust中,对于像i32这样的简单数据类型,描述移动语义是怎样避免重复复制的?请举例说明变量赋值和函数传参过程中移动语义的体现。
32.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

移动语义避免重复复制原理

在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的所有权移动到ba不再能被使用,这样避免了对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的所有权被移动到函数内部的xnum在函数调用后不再有效,同样避免了数据的重复复制。