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

std::vector的emplace_back()函数异常行为原因探究

std::vector::emplace_back() 未触发扩容的原因分析

这是std::vector的扩容机制导致的正常行为,并非异常:

  • std::vector会预分配一段连续的堆内存(即容量capacity()),只有当当前元素数量size()等于容量时,再添加新元素才会触发扩容操作——也就是你说的步骤3:重新分配更大的内存块、移动旧元素到新内存、释放旧内存。
  • 你观察到i=3时缺少步骤3,说明此时vector的容量还能容纳新元素,不需要扩容。

具体场景还原(匹配你的观察)

假设你的测试中vector采用标准库默认的容量翻倍扩容策略:

  • i=0:空vector添加第一个元素,容量初始化为1,size=1无需扩容;
  • i=1:size=1等于capacity=1,触发扩容到2,执行步骤3;
  • i=2:size=2等于capacity=2,触发扩容到4,执行步骤3;
  • i=3:size=3 < capacity=4,容量足够,直接在已分配内存末尾构造新元素,不触发扩容,因此没有步骤3;
  • i=4:size=4等于capacity=4,触发扩容到8,再次执行步骤3。

补充说明

你提到的步骤1(栈上构造对象),如果是指传入emplace_back的临时对象,那么emplace_back会将这个临时对象移动(或拷贝)到vector内存中;如果是直接用emplace_back原地构造(比如emplace_back(123)),则不会有栈上构造步骤——这取决于你的测试代码写法,但核心逻辑始终是扩容仅在容量不足时触发。

内容的提问来源于stack exchange,提问作者Ahmed R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:57:15