
短字符串优化(Small String Optimization,SBO)是 c++ 标准库中 std::string 实现的一种常见底层优化技术,核心目标是:避免小字符串频繁堆分配,把短字符串直接存进对象内部,从而提升性能、减少内存碎片和分配开销。
为什么需要 SBO?
没有 SBO 时,哪怕只存一个字符(如 "a"),std::string 通常也要在堆上分配内存(哪怕只有 1 字节 + 元数据),调用 malloc/new 开销大,且小块堆内存易导致碎片。SBO 就是为解决这个“杀鸡用牛刀”的问题而生的。
SBO 的典型内存布局(以 libstdc++ 和 libc++ 为例)
一个 std::string 对象大小通常是固定的(如 24 或 32 字节),内部包含三部分:
- 指针/长度/容量元数据:比如 8 字节指针 + 8 字节 size + 8 字节 capacity(64 位系统下常见 24 字节布局)
- 内联缓冲区(inline buffer):剩余空间用于存短字符串,例如 24 − 16 = 8 字节 → 最多存 7 字符 + 1 字节 ‘