短字符串优化(Small String Optimization,SBO)是 C++ 标准库中 std::string 实现的一种常见底层优化技术,核心目标是:避免小字符串频繁堆分配,把短字符串直接存进对象内部,从而提升性能、减少内存碎片和分配开销。
没有 SBO 时,哪怕只存一个字符(如 "a"),std::string 通常也要在堆上分配内存(哪怕只有 1 字节 + 元数据),调用 malloc/new 开销大,且小块堆内存易导致碎片。SBO 就是为解决这个“杀鸡用牛刀”的问题而生的。
一个 std::string 对象大小通常是固定的(如 24 或 32 字节),内部包含三部分:
SSO_CAPACITY 或 SHORT_SIZE)当字符串长度 ≤ 容量时,数据就写进对象内部;超过时,才 malloc 堆内存,并把指针指向堆块——此时对象里那个“指针字段”才真正起作用。
没有标准接口直接查询,但可通过间接方式验证:
&str[0] 取地址,再和 str.data() 比较:若相等,大概率在栈/内联区;若不等,说明已堆分配str.capacity():SBO 状态下 capacity 通常等于内联缓冲大小(如 15 或 22),而非堆分配后那种“按需增长”的值(如 31、63)sizeof(std::string) 查对象大小,再结合编译器实现文档(如 GCC libstdc++ 默
认 24 字节,内联 15 字符;Clang libc++ 在 x86_64 上也是 24 字节,支持 22 字符 SBO)SBO 显著加快小字符串构造、拷贝、移动操作,但也有隐含成本:
if (s.size() )
基本上就这些。SBO 不是标准强制要求,而是广泛采用的实践优化。理解它,能帮你写出更可控的字符串密集型代码,也能在性能分析时少踩一个“为什么小字符串也慢”的坑。