You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Rust Vec的reserve_exact方法容量描述与实现的疑问

Vec::reserve_exact 容量“大于等于”的原因解析

你看到grow_exact实现里总是把新容量设成len + additional,但官方文档说调用reserve_exact后容量会大于或等于self.len() + additional,这两种情况会导致容量大于目标值:

  1. 当前容量已经满足需求,无需扩容
    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();
    }
}
  1. 存储零大小类型(ZST)时的特殊处理
    如果Vec存储的是零大小类型(比如()),它的初始容量会被设置为usize::MAX。此时调用reserve_exact:
  • 若self.len() + additional未超过usize::MAX,当前容量已经是usize::MAX,不会触发扩容,容量远大于目标值;
  • 若超过usize::MAX,直接返回容量溢出错误。

另外补充:虽然底层内存分配器可能因为对齐规则或最小分配单位限制,返回比请求更大的物理内存,但Vec对外暴露的逻辑容量仍会被设置为len + additional,这部分额外物理内存不会体现在capacity()的返回值中,因此不属于文档描述的“容量大于”的场景。

内容的提问来源于stack exchange,提问作者Le Dong Thuc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:05:20