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

