为何vec![Vec::with_capacity(n)]创建的子向量容量为0?
为什么子Vec的容量是0而非chunk_size?
核心原因
Vec克隆不保留预分配容量:Vec::with_capacity(chunk_size)生成的是一个空Vec(长度为0),只是提前分配了chunk_size的内存空间。但Vec的Clone方法仅复制Vec的逻辑内容(即内部元素),预分配的容量属于性能优化细节,不属于克隆语义的一部分——空Vec克隆后会生成一个全新的空Vec,默认容量为0。vec![x; n]的克隆逻辑:这个语法要求元素实现Clone,它会先创建初始元素x,然后通过克隆x来填充剩余的n-1个位置。所以你得到的两个子Vec都是初始空Vec的克隆产物,容量自然都是0。
解决方法
要让每个子Vec都独立预分配指定容量,改用迭代器生成的方式,避免克隆:
#[test] fn test() { let chunk_size = 1024; let data: Vec<Vec<u8>> = (0..2).map(|_| Vec::with_capacity(chunk_size)).collect(); assert_eq!(data[0].capacity(), chunk_size); assert_eq!(data[1].capacity(), chunk_size); }
这种方式会为每个子Vec单独调用Vec::with_capacity,确保各自拥有预分配的chunk_size容量,断言可以正常通过。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

