reserve预分配容量但不改变size,仅用于后续push_back;resize直接改变size并初始化元素。需随机访问用resize,仅追加用reserve;错误混用会导致越界或性能浪费。

直接说结论:reserve 是为“将来要塞进去的元素”提前划好地盘,不建房;resize 是直接“盖好 n 套房并住人”,改变实际可用元素数量。用错会导致访问越界、性能浪费或逻辑崩溃。
什么时候该用 reserve?
当你明确知道接下来要插入多少个元素,且打算用 push_back 或 insert 逐个添加时——这是它唯一的正经用途。
- 典型场景:读取文件行数已知、网络包解析前预估元素量、批量构造前预留空间
- 错误做法:调用
reserve(n)后立刻写vec[i] = x(i超出当前size()),会触发未定义行为 - 性能影响:避免多次内存重分配。比如没
reserve时插入 1000 个int,可能触发 10+ 次 realloc + memcpy;加了reserve(1000)后全程零扩容 -
reserve(0)不释放内存,也不保证capacity()变为 0;想缩容得用shrink_to_fit()或swap
什么时候该用 resize?
当你需要“立刻拥有 n 个可安全访问的元素”,不管它们值是多少——这时你是在操作逻辑上的数组长度。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 典型场景:初始化一个固定大小的缓冲区、图像像素数组、矩阵行/列占位、需要
operator[]随机写入的场合 - 注意第二个参数:
resize(n, val)会用val初始化新增元素;省略则调用默认构造(如int得 0,自定义类型调默认构造函数) - 缩小操作:
resize(n)当n < size()时,会析构尾部多余元素,但capacity()通常不变(内存不退) - 常见坑:
resize(10)后vec.size() == 10,但若之前capacity()只有 5,这次调用会自动扩容并初始化新元素——这隐含一次内存分配,不是纯“逻辑调整”
reserve 和 resize 同时出现怎么选?
多数情况下二者不共存;真要组合,顺序必须是先 reserve 再 resize,否则 resize 的扩容行为可能白做。
立即学习“C++免费学习笔记(深入)”;
- 例如:已知最终要 1000 个元素,但中间需逐个计算填值 → 先
vec.reserve(1000),再循环push_back - 又如:需要 1000 个全 0 的
int数组 → 直接vec.resize(1000),不用reserve;因为resize自带分配+初始化,一步到位 - 反模式:
vec.resize(500); vec.reserve(1000);—— 第二步无效,capacity()已 ≥ 500,且后续若再resize(1000),前面的reserve也无意义 - 关键判断依据:看你要不要“立刻访问第 i 个位置”。要 →
resize;不要,只管往后塞 →reserve
最容易被忽略的一点:二者都不保证迭代器/指针长期有效。reserve 不失效(因不改变 size 且不移动已有元素),但 resize 在扩容时会失效;而任何一次导致重新分配的操作(包括某些 resize)都会让所有现存指针、引用、迭代器失效——这点在回调或异步上下文中极易踩坑。

















