1 计算器内存处理流派
计算机语言三种流派
-
垃圾回收机制,Java,Go
-
手动管理内存的分配和释放 C++
-
通过所有权来管理内存 Rust
2 栈(Stack)与堆(Heap)
2.1 栈
栈按照顺序存储值,先进后出取值。移入数据叫做进栈,移出数据叫做出栈。 栈中的所有数据在编译期已经内存占用已知。
2.2 堆
与栈不同,对于大小未知或者可能变化的数据,需要将它存储到堆上。向堆放入数据,需要申请内存空间,操作系统返回一个该地址的指针,该过程被称为仔堆上分配内存,allocating。指针会被推入栈中(指针大小固定)。
2.3 性能区别
在栈上分配内存比在堆上分配内存要快,入栈无需操作系统进行函数调用。堆上分配内存,操作系统首先需要找到一个足够存放数据的内存空间,如果当前内存页不足,需要进行系统调用申请更多内存。
3 所有权原则
- Rust中每一个值都被一个变量所拥有,该变量被称为值的所有者
- 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者
- 当所有者(变量)离开作用域范围时,这个值将被丢弃(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);
// }