- 栈帧与局部变量存储概述
- 在Rust中,栈帧是函数调用时在栈上分配的一块内存区域,用于存储函数的局部变量、参数、返回地址等信息。当函数被调用时,栈帧被创建,函数执行完毕后,栈帧被销毁。
- 不同类型局部变量的存储方式
- 整数类型
- 整数类型(如
i32
、u64
等)在栈帧中以值的形式直接存储。它们占据固定大小的内存空间,例如i32
占用4个字节,u64
占用8个字节。这些值按照声明的顺序依次在栈帧中分配内存。例如:
fn main() {
let num1: i32 = 10;
let num2: u64 = 200;
// num1和num2按顺序在栈帧中存储其值
}
- 字符串类型
- 字符串字面量(
&str
):字符串字面量是不可变的,它们存储在程序的只读数据段中。在栈帧中,&str
类型的局部变量存储的是指向字符串字面量数据的指针以及字符串的长度。例如:
fn main() {
let s: &str = "hello";
// 栈帧中存储指向"hello"的指针和长度5
}
- **拥有所有权的字符串(`String`)**:`String`类型是可增长的、可变的字符串类型。在栈帧中,`String`类型的局部变量存储一个指向堆上实际字符串数据的指针、字符串的长度和容量。实际的字符串数据存储在堆上。例如:
fn main() {
let mut s = String::from("world");
// 栈帧中存储指向堆上"world"数据的指针、长度5和容量(可能大于5)
}
- 自定义结构体类型
- 如果自定义结构体的所有字段都是简单类型(如整数、固定大小的数组等),那么结构体实例在栈帧中以值的形式存储,所有字段按照声明顺序依次排列。例如:
struct Point {
x: i32,
y: i32,
}
fn main() {
let p = Point { x: 1, y: 2 };
// 栈帧中依次存储p.x和p.y的值
}
- 如果结构体包含像`String`这样在堆上分配内存的类型,那么栈帧中结构体实例存储的是指向堆上数据的指针(对于`String`字段)以及其他简单类型字段的值。例如:
struct User {
name: String,
age: u32,
}
fn main() {
let u = User { name: String::from("Alice"), age: 30 };
// 栈帧中存储指向堆上"Alice"的指针、name的长度和容量,以及age的值30
}