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
相关产品推荐
相关产品推荐

