vec!是什么
vec!
的内存机制解析
let v = vec![1, 2, 3];
这个宏创建了一个堆分配的动态数组,等价于:
let mut v = Vec::new();
v.push(1);
v.push(2);
v.push(3);
🧠 Vec 的内存结构(三元组)
Rust 中的 Vec<T>
本质是一个结构体,在栈上存储三个字段:
struct Vec<T> {
ptr: *mut T, // 指向堆内存的指针
len: usize, // 当前元素数量
capacity: usize, // 当前堆容量
}
部位 | 存储位置 | 说明 |
---|---|---|
Vec 本体 | 栈(Stack) | 存储元数据 |
数据内容 | 堆(Heap) | 实际元素 [1,2,3] |
🔧 内存分配流程
创建 Vec:
Vec::new()
不分配堆内存。插入元素:触发堆分配。
扩容策略:容量不足时自动扩容(通常翻倍)。
释放内存:生命周期结束时自动释放(RAII)。
🗂 内存示意图
栈内存:
┌────────────┐
│ ptr--------┼──────────────┐
│ len: 3 │ │
│ cap: 4 │ │
└────────────┘ ▼
堆内存:
┌─────────────┐
│ [1, 2, 3, ?]│
└─────────────┘
🔥 特性一览
特性 | 描述 |
---|---|
堆分配 | Vec 的动态大小必须存储在堆上 |
自动扩容 | 默认按倍数增长,提高 push 效率 |
零开销抽象 | 不访问元素时没有性能开销 |
自动释放资源(RAII) | 生命周期结束自动 drop ,释放内存 |
move 转移所有权 | 移动 Vec 会转移堆内存的所有权 |
clone 深拷贝 | 克隆 Vec 时会分配新堆内存并复制数据 |
⚠️ 注意事项
vec![0; 1000]
:分配 1000 个元素并初始化为 0。Vec::with_capacity(n)
:预分配但不初始化,性能更高。Vec
是 Rust 中性能与安全的经典代表。
版权所有
版权归属:pushme