Stack & Heap
- Stack
- LIFO (last in first out)
- 栈中的所有数据都必须占用已知且固定大小的内存空间
- Heap
- priority queue, only support insert and find-max/find-min
- 与栈不同,对于大小未知或者可能变化的数据,我们需要将它存储在堆上。
- 当向堆上放入数据时,需要请求一定大小的内存空间。操作系统在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的指针, 该过程被称为在堆上分配内存,有时简称为 “分配”(allocating)。
- 接着,该指针会被推入栈中,因为指针的大小是已知且固定的,在后续使用过程中,你将通过栈中的指针,来获取数据在堆上的实际内存位置,进而访问该数据。
- 性能:Stack > Heap
- 栈数据往往可以直接存储在 CPU 高速缓存中,而堆数据只能存储在内存中。访问堆上的数据比访问栈上的数据慢,因为必须先访问栈再通过栈上的指针来访问内存。
- 所有权与堆栈的关系
- 当你的代码调用一个函数时,传递给函数的参数(包括可能指向堆上数据的指针和函数的局部变量)依次被压入栈中,当函数调用结束时,这些值将被从栈中按照相反的顺序依次移除。
- 所有权负责跟踪这些数据何时分配和释放
- 否则堆上的数据将产生内存泄漏 —— 这些数据将永远无法被回收
所有权规则
<aside>
💡
- Rust 中每一个值都被一个变量所拥有,该变量被称为值的所有者
- 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者
- 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)
</aside>