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

为何std::string默认容量为15?调用reserve(5)为何被忽略?

std::string reserve(5)后capacity返回15的原因

先看你提供的测试代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s;
    s.reserve(5);
    cout << s.capacity() << endl;
}

你预期调用reserve(5)后capacity()返回5,但实际得到15,核心原因是C++标准对reserve的行为定义并非“精确设置容量为n”:

  • std::string::reserve(n)的唯一保证是:执行后字符串的容量不小于n,具体分配的容量大小由标准库实现自行决定,目的是减少后续内存分配次数、提升性能。
  • 大多数主流标准库(比如GCC的libstdc++)都实现了小字符串优化(SSO):std::string内部自带一个固定大小的字符缓冲区(通常是15字节,预留1字节存字符串结束符\0)。当你要求的预留大小(5)小于等于这个缓冲区容量时,标准库不会去堆上分配内存,直接复用内部缓冲区,此时capacity()返回的就是这个内部缓冲区的总大小15。

如果要验证这个逻辑,可以试试调用reserve(20),此时因为20超过了内部缓冲区大小,标准库会在堆上分配至少20字节的空间,capacity()的返回值就会变成20(或符合内存对齐要求的更大值),示例代码如下:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s;
    s.reserve(5);
    cout << "reserve(5)后capacity: " << s.capacity() << endl;
    
    s.reserve(20);
    cout << "reserve(20)后capacity: " << s.capacity() << endl;
}

内容的提问来源于stack exchange,提问作者3088 K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:40:25