重新调整大小

我们提到过Vec是一种“可增长”的向量类型,但这具体意味着什么呢? 如果尝试在一个已经达到最大容量的Vec中插入一个元素会发生什么?

#![allow(unused)]
fn main() {
let mut numbers = Vec::with_capacity(3);
numbers.push(1);
numbers.push(2);
numbers.push(3); // 达到最大容量
numbers.push(4); // 这里会发生什么?
}

这时,Vec将会自动扩容
它会向分配器请求一块新的(更大)堆内存,将所有元素复制过去,并释放旧的内存空间。

这个操作可能会比较昂贵,因为它涉及到了新的内存分配及现有所有元素的复制过程。

Vec::with_capacity

如果你对将要在Vec中存储多少个元素有个大概的预估,可以使用Vec::with_capacity方法预先分配足够的内存。
这可以在Vec增长时避免新的内存分配操作,但如果你高估了实际使用量,也可能造成内存浪费。

这需要根据具体情况具体分析权衡。