🎯官方解释
所有权(系统)是 Rust 最为与众不同的特性,对语言的其他部分有着深刻含义。它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全,因此理解 Rust 中所有权如何工作是十分重要的。本章,我们将讲到所有权以及相关功能:借用(borrowing)、slice 以及 Rust 如何在内存中布局数据。
所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。在运行时,所有权系统的任何功能都不会减慢程序。
🎯共同点
栈和堆都是代码在运行时可供使用的内存,但是它们的结构不同。
🎯区别
🥽栈的特点
栈以放入值的顺序存储值并以相反顺序取出值。这也被称作 后进先出(last in, first out)。
增加数据叫做 进栈(pushing onto the stack),而移出数据叫做 出栈(popping off the stack)。
栈中的所有数据都必须占用已知且固定的大小。
入栈比在堆上分配内存要快,因为(入栈时)分配器无需为存储新数据去搜索内存空间;其位置总是在栈顶。
当你的代码调用一个函数时,传递给函数的值(包括可能指向堆上数据的指针)和函数的局部变量被压入栈中。当函数结束时,这些值被移出栈。
🥽堆的特点
在编译时大小未知或大小可能变化的数据,要改为存储在堆上。
堆是缺乏组织的:当向堆放入数据时,你要请求一定大小的空间。
内存分配器(memory allocator)在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的 指针(pointer)。这个过程称作 在堆上分配内存(allocating on the heap),有时简称为 “分配”(allocating)。
在堆上分配内存则需要更多的工作,这是因为分配器必须首先找到一块足够存放数据的内存空间,并接着做一些记录为下一次分配做准备。
访问堆上的数据比访问栈上的数据慢,因为必须通过指针来访问。现代处理器在内存中跳转越少就越快(缓存)。
🎯所有权存在的原因
- 所有权解决的问题:
-跟踪代码的哪些部分正常使用heap的哪些数据。
-最小化heap上的重复数据量。
-清理heap上未使用的数据,以免空间不足。
- 一旦你懂的了所有权,那么就不需要经常去想stack或heap了。
- 但是知道管理heap数据是所有权存在的原因,这有助于解释它为什么这样工作。