RUST 学习日记 第10课 ——所有权

114 阅读2分钟

1 计算器内存处理流派

计算机语言三种流派

  1. 垃圾回收机制,Java,Go

  2. 手动管理内存的分配和释放 C++

  3. 通过所有权来管理内存 Rust

2 栈(Stack)与堆(Heap)

2.1 栈

栈按照顺序存储值,先进后出取值。移入数据叫做进栈,移出数据叫做出栈。 栈中的所有数据在编译期已经内存占用已知。

2.2 堆

与栈不同,对于大小未知或者可能变化的数据,需要将它存储到堆上。向堆放入数据,需要申请内存空间,操作系统返回一个该地址的指针,该过程被称为仔堆上分配内存,allocating。指针会被推入栈中(指针大小固定)。

2.3 性能区别

在栈上分配内存比在堆上分配内存要快,入栈无需操作系统进行函数调用。堆上分配内存,操作系统首先需要找到一个足够存放数据的内存空间,如果当前内存页不足,需要进行系统调用申请更多内存。

3 所有权原则

  1. Rust中每一个值都被一个变量所拥有,该变量被称为值的所有者
  2. 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者
  3. 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)

4 变量作用域

作用域是一个变量在程序中有效的范围

//s变量从申明的点开始直到当前作用域的结束都是有效的
let s = "hello";

5 源码

fn main() {

/*

计算机语言三种流派

1. 垃圾回收机制,Java,Go

2. 手动管理内存的分配和释放 C++

3. 通过所有权来管理内存 Rust

*/

// println!("Hello, world!");

  


//练习1

//代码没有发生所有权转移

//第一步 x赋值为5

//第二部 y赋值x的值,即拷贝x的值给y

// let x = 5;

// let y = x;

  


//练习2

//当s1被赋予s2后,Rust认为s1不再有效

//s1的所有权转移给了s2后,s1马上失效 操作称为 移动

// let s1 = String::from("hello");

// let s2 = s1;

// println!("{},world",s1);

  


//练习3

//x指针的内容复制赋予给y

//所有整数类型 布尔类型 浮点类型 字符类型 元祖(当且仅当其内元素可以在站内copy)&T不可变引用

// let x: &str = "hello,world";

// let y = x;

// println!("{}.{}", x, y);

  


//练习4

// let s = String::from("hello");//s进入作用域

// takes_ownership(s);//s移入函数里面

// //这里s不再有效

  
  


}

  


// fn takes_ownership(some_string: String) {

// println!("{}", some_string);

// }

源码地址