let vec_macro = vec![0, 1, 2, 3, 4];
let mut vec = Vec::new();
for i in 0..5 {
vec.push(i)
}
println!("Capacity of vec with macro: {}", vec_macro.capacity());
println!("Capacity of vec push: {}", vec.capacity());
// Result:
// Capacity of vec with macro: 5
// Capacity of vec push: 8
Run Code Online (Sandbox Code Playgroud)
我创建了 2 个向量,第一个向量带有宏vec!,第二个向量带有Vec::new(),然后我将项目从 0 推入到它们中。预期的结果是这两个向量的容量相同,但事实并非如此。这是实施中的错误吗vec!?
该宏知道元素的数量,因此它会创建具有最佳容量的向量(另请参阅with_capacity())。
您的循环调用了push()多次,但此操作本身并不知道我们何时停止推送元素。因此,其背后的策略是用指数容量(0、4、8、16、32...例如在我的计算机上)来摊销动态内存重新分配的成本。当您推送很少的元素时,容量保持较低(我们不会浪费太多未使用的已分配内存),但如果您推送许多元素,重新分配将越来越大的步骤增长,以便不会太频繁地发生。
目前,我们看到它在耗尽时只是将容量(无论它是什么)加倍。如果我们从零开始然后推送,它似乎选择 4 作为初始容量,然后根据需要将其加倍,但如果我们从 5 开始,它仍然会继续将容量加倍(10、20...)。但是,我们现在看到的内容并不能得到保证,并且可能在未来的版本中随时发生变化。