Skip to content

vec!是什么

约 402 字大约 1 分钟

rust

2025-06-03

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]

🔧 内存分配流程

  1. 创建 VecVec::new() 不分配堆内存。

  2. 插入元素:触发堆分配。

  3. 扩容策略:容量不足时自动扩容(通常翻倍)。

  4. 释放内存:生命周期结束时自动释放(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 中性能与安全的经典代表。