小字符串优化(Small String Optimization,SBO)是 std::string 实现中一种常见的空间与性能兼顾的技巧:当字符串内容很短时,不堆分配内存,而是直接把字符存进对象内部的固定缓冲区里。
频繁构造、拷贝短字符串(比如 "a"、"true"、"id_123")时,每次都调用 new/delete 开销大,还容易造成内存碎片。SBO 把小字符串“装进自己
身体里”,避免动态分配,提升缓存局部性,也减少堆操作次数。
典型实现中,std::string 对象内部包含一个小型固定数组(如 16 或 22 字节),加上长度、容量等字段。它用一个标志位或通过容量值隐式判断当前是否处于“小模式”:
\0 和元数据开销)→ 数据存在栈上,不 new这不是标准强制要求,而是各实现的优化策略:
\0),即最多存 14 个字符你可以用 sizeof(std::string) 粗略推测——多数实现下是 24 或 32 字节,其中一部分就是留给 SBO 的缓冲空间。
SBO 带来便利,但也有些易忽略的行为:
c_str() 仍返回合法地址,但内存不在堆上,不能跨作用域保存指针data() 和 c_str() 在小模式下指向对象内部,生命周期绑定于 string 对象本身基本上就这些。SBO 不是黑魔法,它是 std::string 在常见场景下“悄悄变快”的关键设计之一。理解它,能帮你写出更可控的字符串操作代码,也能看懂一些看似奇怪的性能现象。