Rust栈和堆
提示
- 栈的概念与操作:栈是后进先出(LIFO)的内存区域,用于存储编译时已知大小的数据。数据按顺序插入并按相反顺序移除,称为推入栈和从栈弹出。
- 堆的使用与特点:堆用于存储动态大小或生命周期不确定的数据。使用
Box<T>
在堆上分配内存,与 栈不同,堆分配的内存可以在不同函数间传递和保持活跃。 - 栈和堆的区别:栈访问更快、内存管理简单,主要用于小型固定大小数据。堆访问较慢、内存管理更复杂,用于动态或大型数据,如
String
、Vector
等。
栈和堆是我们的 Rust 代码在运行时可用的内存部分。
Rust 是一种内存安全的编程语言。为了确保 Rust 的内存安全,它引入了所有权、引用和借用等概念。
要理解这些概念,我们首先必须了解如何在栈和堆中分配和释放内存。
栈(Stack)
栈可以被想象成一堆书。当我们添加更多书籍时,我们把它们放在堆顶。当我们需要一本书时,我们从顶部取一本。
栈按顺序插入值。它按相反的顺序获取并移除值。
- 添加数据被称为推入栈(pushing onto the stack)
- 移除数据被称为从栈弹出(popping off the stack)
这种现象在编程中被称为后进先出(Last In, First Out,LIFO)。
存储在栈上的数据必须在编译时具有固定大小。Rust 默认为基本类型在栈上分配内存。
让我们通过一个例子来可视化栈上的内存分配和释放。
fn foo() {
let y = 999;
let z = 333;
}
fn main() {
let x = 111;
foo();
}
在上面的例子中,我们首先调用函数 main()
。main()
函数有一个变量绑定 x