重新调整大小
我们提到过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
增长时避免新的内存分配操作,但如果你高估了实际使用量,也可能造成内存浪费。
这需要根据具体情况具体分析权衡。