贝利信息

C++ vector reserve作用 C++ 预分配内存减少拷贝次数【效率】

日期:2026-01-26 00:00 / 作者:冰火之心
reserve不改变size只影响capacity,它预先分配至少指定大小的内存但不构造元素,因此size不变而capacity≥请求值,错误访问未构造位置会导致未定义行为。

reserve 不改变 size,只影响 capacity

reserve 的作用是提前为 vector 的内部动态数组分配至少指定大小的内存,但它**不会构造任何元素**,因此调用后 vector::size() 不变,vector::capacity() 会 ≥ 请求值。常见误解是以为 reserve(n) 后就能直接访问 v[0]v[n-1] —— 实际会越界,因为这些位置根本没被构造。

典型误用场景:

什么时候调用 reserve 才真正提升性能

只有在你能预估最终元素数量、且后续操作以 push_back 为主时,reserve 才有明确收益。例如读取文件行数

已知、解析固定长度数组、批量生成对象等。

关键判断点:

立即学习“C++免费学习笔记(深入)”;

示例:读取 1000 行文本前调用 v.reserve(1000),可避免 vector 多次按 1.5 倍增长导致的 7–10 次内存重分配与元素拷贝。

reserve 和 resize 的核心区别必须分清

reserve(n) 是“我打算塞最多 n 个,你先把地圈好”;resize(n) 是“我现在就要 n 个,不够的给我默认构造出来”。两者语义完全不同,不能互相替代。

常见混淆表现:

reserve 的实际调用时机与陷阱

最安全的调用点是在所有元素插入开始前、且数量可预测时。但要注意几个隐性坑:

真正容易被忽略的是:reserve 解决不了迭代器失效问题。只要发生 reallocation(包括由 reserve 主动触发的那次),原有迭代器、指针、引用全部失效 —— 这点和 resize 不同,后者在不扩容时保持有效性。