给定以下代码,为什么capacity
每个向量的 是 0 而不是chunk_size
?
#[test]
fn test() {
let chunk_size = 1024;
let data: Vec<Vec<u8>> = vec![Vec::with_capacity(chunk_size); 2];
assert_eq!(data[0].capacity(), chunk_size);
assert_eq!(data[1].capacity(), chunk_size);
}
并非全部都是 0,第二个是 1024:
游乐场。
如果我们增加外部向量的大小,我们可以看到它始终是最后一个元素,即 1024,而所有其他元素均为 0。
这是为什么?
那是因为
vec![]
宏用于Clone
填充元素。为了不克隆超出需要的元素,它会克隆除最后一个元素之外的所有元素,并重新使用为最后一个元素提供的元素(因为它需要它来供所有其他元素克隆)。克隆一个
Vec
不考虑容量。它只分配足够的元素来保存长度。如果你考虑到容量并不总是有意的,那么这个决定是有道理的:很多时候,大多数时候,它只是在Vec
推动容量增长时所剩下的。那么,当我们有一个全新的开始时,为什么要分配比需要的更多的钱呢?