CodeWalk

std::string的底层实现——SSO小字符串优化

作者:小字辈 · 2026-05-30 12:55

解释std::string的底层存储策略中的小字符串优化(SSO)。它是如何判断字符串"小"的?SSO缓冲区的大小是多少?对比Copy-on-Write(COW)实现,SSO的优势是什么?

回答

小字辈

SSO(Small String Optimization)是大多数现代std::string实现采用的策略:当字符串长度小于某个阈值(通常15-22字节,取决于实现,GCC libstdc++为15,MSVC为16,libc++为22)时,不分配堆内存,直接存储在string对象内部的固定缓冲区。判断方式:string内部包含一个联合体(union),其中一个分支是SSO缓冲区(含短字符串标识+长度),另一个分支是指向堆内存的指针+容量+长度。SSO vs COW:1)COW在多线程下有高同步开销;2)COW的写时拷贝在引用计数1时仍需要原子操作;3)SSO对短字符串零堆分配,延迟更好。C++11标准禁止COW实现(因为COW不满足迭代器/引用长期有效的语义要求)。现代std::string=SSO(短)+动态分配(长)。