提问人:Tim 提问时间:9/20/2023 最后编辑:kmdrekoTim 更新时间:9/20/2023 访问量:105
为什么 vec![Vec::with_capacity(n)] 为子向量创建 0 容量?
Why does vec![Vec::with_capacity(n)] create 0 capacity for the sub-vectors?
问:
给定以下代码,为什么每个向量的 0 而不是 ?capacity
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);
}
答:
8赞
Chayim Friedman
9/20/2023
#1
并非所有都是零,第二个是 1024:
fn main() {
let chunk_size = 1024;
let data: Vec<Vec<u8>> = vec![Vec::with_capacity(chunk_size); 2];
dbg!(data[0].capacity(), data[1].capacity());
}
游乐场。
如果我们增加外部向量的大小,我们可以看到它始终是最后一个元素,即 1024,而所有其他元素都是零。
为什么?
这是因为宏用于填充元素。为了不克隆超过需要的元素,它会克隆除最后一个元素之外的所有元素,并重用为最后一个元素提供的元素(因为它需要它才能克隆所有其他元素)。vec![]
Clone
克隆 Vec
不考虑容量。它只分配足够的元素来保持长度。如果你考虑到容量并不总是有意的,这个决定是有道理的:很多时候,大多数时候,它只是在努力的同时增长的剩余部分。那么,当我们有一个全新的开始时,为什么要分配超过需要的金额呢?Vec
评论
0赞
Tim
9/20/2023
谢谢。这似乎是编译警告或 linter 消息的候选者。
0赞
Chayim Friedman
9/20/2023
@Tim可以,您可以向 Clippy 提出问题。
评论