Dado o código a seguir, por que o capacity
de cada um dos vetores é 0 em vez de 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);
}
Link do parque infantil: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=0c40515b164044621c369adef1090c6e
Nem todos são zero, o segundo é 1024:
Parque infantil .
E se aumentarmos o tamanho do vetor externo, podemos ver que é sempre o último elemento que é 1024, e todos os outros são zero.
Por que é que?
Isso porque a
vec![]
macro utilizaClone
para preencher os elementos. Para não clonar mais do que o necessário, ele clona todos os elementos, exceto o último, e reutiliza o elemento fornecido para o último (já que precisa dele para todos os outros clonarem).A clonagem de a
Vec
não considera a capacidade . Ele aloca apenas elementos suficientes para manter o comprimento. Essa decisão faz sentido se você considerar que a capacidade nem sempre é intencional: muitas vezes, na maioria das vezes, é apenas o que sobrou do crescimento enquanto seVec
investe nela. Então, quando temos um novo começo, por que alocar mais do que o necessário?