在C++标准库中,std::string提供了resize和reserve两个用于调整字符串状态的方法,二者都涉及内存操作,但核心功能和使用场景有明显区别,理解这些差异是做好字符串内存管理的基础。

resize和reserve的核心差异
resize的核心作用是调整字符串的有效长度,同时可能会触发内存分配;reserve的核心作用是调整字符串的容量,也就是预分配内存空间,不会改变字符串的有效长度。
resize方法详解
resize方法有两种常用重载形式:
void resize(size_t n):将字符串长度调整为n,如果n大于当前长度,新增的部分用空字符填充;如果n小于当前长度,字符串会被截断。void resize(size_t n, char c):将字符串长度调整为n,如果n大于当前长度,新增的部分用字符c填充;如果n小于当前长度,字符串会被截断。
当resize的目标长度n超过当前字符串的容量时,会触发内存重新分配,容量会至少扩大到n;如果n小于等于当前容量,通常不会触发内存重新分配。
下面是resize的使用示例:
#include <iostream>
#include <string>
int main() {
std::string s = "hello";
std::cout << "初始长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
// 长度扩大到8,新增部分用空字符填充
s.resize(8);
std::cout << "resize(8)后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
// 输出字符串,空字符不会显示
std::cout << "内容: " << s << std::endl;
// 长度扩大到10,新增部分用'x'填充
s.resize(10, 'x');
std::cout << "resize(10, 'x')后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
std::cout << "内容: " << s << std::endl;
// 长度缩小到3,截断字符串
s.resize(3);
std::cout << "resize(3)后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
std::cout << "内容: " << s << std::endl;
return 0;
}
reserve方法详解
reserve方法的作用是请求字符串的容量至少达到指定的大小,其函数原型为:
void reserve(size_t n = 0)
当n大于当前容量时,会重新分配内存,将容量扩大到至少n;当n小于等于当前容量时,通常不会缩小容量,不同编译器实现可能有差异,标准没有强制要求缩小容量。
需要注意的是,reserve不会改变字符串的有效长度,调用后size()的返回值不会变化,只是预分配了内存,避免后续追加字符时频繁触发内存重新分配。
下面是reserve的使用示例:
#include <iostream>
#include <string>
int main() {
std::string s = "hello";
std::cout << "初始长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
// 预分配容量为20
s.reserve(20);
std::cout << "reserve(20)后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
std::cout << "内容: " << s << std::endl;
// 追加字符,不会触发内存重新分配,因为容量足够
for (int i = 0; i < 10; ++i) {
s.push_back('a');
}
std::cout << "追加10个字符后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
// 请求容量缩小到5,通常不会生效
s.reserve(5);
std::cout << "reserve(5)后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
return 0;
}
二者的对比总结
为了更清晰地区分两个方法,我们可以从以下几个维度对比:
| 对比维度 | resize | reserve |
|---|---|---|
| 核心作用 | 调整字符串有效长度 | 调整字符串容量(预分配内存) |
| 对size()的影响 | 会改变,等于传入的参数n(除非n小于原长度) | 无影响,size()保持不变 |
| 对capacity()的影响 | 可能改变,当n超过当前容量时会扩大 | 可能改变,当n超过当前容量时会扩大 |
| 是否填充字符 | 是,新增部分用指定字符或空字符填充 | 否,只分配内存不改变内容 |
| 典型使用场景 | 需要明确设置字符串长度,或者截断字符串 | 提前预分配内存,避免频繁扩容提升性能 |
使用注意事项
- 不要混淆长度和容量:长度是字符串当前有效字符的个数,容量是已分配的内存能容纳的字符个数,
resize改变长度,reserve改变容量。 - 调用
resize(n)后如果n大于原长度,新增的位置是空字符,不是空格,输出时不会显示,如果需要填充其他字符要使用带第二个参数的重载。 reserve预分配的内存只是建议,编译器可能会分配比请求更大的容量,不同标准库实现的扩容策略不同。- 如果需要缩小字符串的容量,可以使用
shrink_to_fit方法,不过该方法也是请求缩小,不保证一定生效。
在实际开发中,如果需要频繁向字符串追加字符,提前用reserve预分配足够的容量可以减少内存重新分配的次数,提升程序性能;如果需要调整字符串的实际内容长度,再使用resize方法。
C++_stringresizereserve内存管理长度调整修改时间:2026-07-11 12:03:40