Rust 所有权

发布时间: 更新时间: 总字数:613 阅读时间:2m 作者: 分享 复制网址

所有权(ownership)Rust的核心特性,Rust的内存通过一套所有权系统管理,在编译时检查规则,且不影响程序运行时的效率。

预备知识

  • 栈 stack,数据在内存中顺序存放,访问快
  • 堆 heap,数据在内存中按照指定规则随机存放,访问慢

作用

  • Rust 独有特性,使其无需 GC 就可以保证内存安全
  • 所有权用来解决跟踪代码的哪些部分正在使用 heap(堆)的哪些数据
  • 最小化 heap 上的重复数据量
  • 清理 heap 上未使用的数据以避免空间不足

所有权规则

  • 每个值都有一个变量,该变量是该值的所有者
  • 每个值同时只有一个所有者
  • 当所有者超出作用域(scope)时,该值将被删除
  • 把一个值赋给其它变量时会发生移动
  • 当一个包含 heap 数据的变量离开作用域时,它的值会被 drop 函数清理,除非数据的所有权转移到另一个变量上
  • 函数使用某值,并不获取所有权示例:
fn main() {
    let str = String::from("hello str");
    let (str2, len) = len_fn(str);
    println!("str2 = {}, len = {}", str2, len)
}

fn len_fn(s: String) -> (String, usize) {
    let len = s.len();
    (s, len)
}

变量的作用域(scope)

  • 程序中变量的有效访问,一般问申明后,出}前,与其他语音类似

返回值与作用域(scope)

函数在返回值的过程中,也会发生所有权的转移

区别于其他程序

  • 一些程序通过自己垃圾收集机制,在程序运行时回收内存
  • 一些程序需要显示的分配和释放内存

所有权与函数

需要先了解 Move/Copy

将值传递给函数将发生移动或复制,和将值赋值给变量是类似的,示例:

fn main() {
    let str = String::from("hello string!");
    print_str(str);
    // 变量 str 在后面不可使用

    let x = 2;
    print_int(x);  // 变量 x 在后面继续有效
    println!("x = {}", x)
}

fn print_str(str: String){
    println!("{}", str);
}

fn print_int(num: i32) {
    println!("{}", num);
}

最新评论
加载中...
Home Archives Categories Tags Statistics