给出以下代码,为什么每个向量的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);
}

playground 链接:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=0c40515b164044621c369adef1090c6e

推荐答案

不是all个是零,第二个是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());
}

Playground.

如果我们增加外部向量的大小,我们可以看到它总是最后一个元素,也就是1024,其他所有的元素都是零.

为什么会这样呢?

这是因为vec![]宏使用Clone来填充元素.为了不克隆超过所需的元素,它克隆除最后一个元素之外的所有元素,并重用为最后一个元素提供的元素(因为它需要它才能从所有其他元素进行克隆).

Cloning a Vec does not consider the capacity.它只分配足够的元素来保持长度.如果你考虑到运力并不总是故意的,这个决定是有意义的:很多时候,大多数时候,这只是在推进的同时增加Vec的剩余.那么,当我们有一个新的开始时,为什么要分配比需要的更多的资金呢?

Rust相关问答推荐

通用池类型xsx

如何从铁 rust 中呼唤_mm_256_mul_ph?

有没有办法模仿对象安全克隆?

在rust sqlx中使用ilike和push bind

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

为什么Option类型try块需要类型注释?

使用 serde::from_value 反序列化为泛型类型

从管道读取后重置标准输入

.在 Rust 模块标识符中

RUST 中的读写器锁定模式

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

Rust 重写函数参数

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

可以在旋转循环中调用try_recv()吗?

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题

为什么这个 Trait 无效?以及改用什么签名?