
什么是SBO(小字符串优化)
SBO 是 Small String Optimization 的缩写,是 C++ 标准库中 std::string 实现的一种常见性能优化技术。它的核心思想是:**对短字符串不堆分配内存,而是直接把字符存放在 string 对象内部的固定缓冲区中**。
比如一个空字符串或长度仅几个字符的字符串(如 "hello"),如果每次都要调用 new 分配堆内存,开销大、缓存不友好、还容易造成碎片。SBO 就是为解决这个问题而生的——它让小字符串“自给自足”,避免了动态分配。
SBO 在 libc++、libstdc++ 和 MSVC 中的典型实现
不同 STL 实现对 SBO 的具体策略略有差异,但逻辑一致:
-
libc++(LLVM):默认使用 23 字节的内部缓冲区(含结尾
\0),即最多存 22 个字符 + 1 个 null;对象总大小通常为 24 字节(紧凑布局)。 - libstdc++(GCC):在 x86_64 上也常用 15 字节缓冲区(16 字节对齐),即最多存 15 个字符;结构体包含指针+长度+容量,当字符串 ≤15 字节时,复用指针字段存储数据本身(通过 tag bit 或 union 技巧区分)。
- MSVC(Visual Studio):类似 libstdc++,用 16 字节缓冲区(15 字符 + \0),采用 union + _Is_long 标志位判断当前是否启用 SBO。
它们都靠一个标志位(或指针是否对齐/特殊值)来区分“短串模式”和“长串模式”。一旦字符串增长超过缓冲区上限,就自动切换到堆分配,并把原有内容拷贝过去。
立即学习“C++免费学习笔记(深入)”;
为什么 SBO 能提升性能?关键在三方面
SBO 不是炫技,而是针对真实使用场景做的务实优化:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~