关于Rust Vec的reserve_exact方法容量描述与实现的疑问
Vec::reserve_exact 容量“大于等于”的原因解析
你看到grow_exact实现里总是把新容量设成len + additional,但官方文档说调用reserve_exact后容量会大于或等于self.len() + additional,这两种情况会导致容量大于目标值:
- 当前容量已经满足需求,无需扩容
reserve_exact的核心逻辑会先做检查:如果当前容量已经≥self.len() + additional,直接返回,不会调用grow_exact。比如你有个Vec当前容量是10、长度是5,调用reserve_exact(3)时,目标容量是5+3=8,10已经大于8,所以容量保持10不变,自然比目标值大。对应的核心逻辑代码大概是:
pub fn reserve_exact(&mut self, additional: usize) { let required = self.len().checked_add(additional).expect("capacity overflow"); if self.capacity() < required { self.buf.grow_exact(self.len(), additional).unwrap(); } }
- 存储零大小类型(ZST)时的特殊处理
如果Vec存储的是零大小类型(比如()),它的初始容量会被设置为usize::MAX。此时调用reserve_exact:
- 若
self.len() + additional未超过usize::MAX,当前容量已经是usize::MAX,不会触发扩容,容量远大于目标值; - 若超过
usize::MAX,直接返回容量溢出错误。
另外补充:虽然底层内存分配器可能因为对齐规则或最小分配单位限制,返回比请求更大的物理内存,但Vec对外暴露的逻辑容量仍会被设置为len + additional,这部分额外物理内存不会体现在capacity()的返回值中,因此不属于文档描述的“容量大于”的场景。
内容的提问来源于stack exchange,提问作者Le Dong Thuc
相关产品推荐
相关产品推荐

