
SBO 是 Small String Optimization 的缩写,是 C++ 标准库中 std::string 实现的一种常见性能优化技术。它的核心思想是:**对短字符串不堆分配内存,而是直接把字符存放在 string 对象内部的固定缓冲区中**。
比如一个空字符串或长度仅几个字符的字符串(如 "hello"),如果每次都要调用 new 分配堆内存,开销大、缓存不友好、还容易造成碎片。SBO 就是为解决这个问题而生的——它让小字符串“自给自足”,避免了动态分配。
不同 STL 实现对 SBO 的具体策略略有差异,但逻辑一致:
\0),即最多存 22 个字符 + 1 个 null;对象总大小通常为 24 字节(紧凑布局)。它们都靠一个标志位(或指针是否对齐/特殊值)来区分“短串模式”和“长串模式”。一旦字符串增长超过缓冲区上限,就自动切换到堆分配,并把原有内容拷贝过去。
立即学习“C++免费学习笔记(深入)”;
SBO 不是炫技,而是针对真实使用场景做的务实优化:
malloc/free 开销,也不触发内存管理器锁。vector<string></string>)。没有标准接口直接查询,但可通过间接方式验证:
sizeof(std::string):若为 24 或 32 字节,大概率启用了 SBO(堆分配模式下光指针+size+cap 就要 24 字节,SBO 必须塞进同一块空间)。&s[0],多次赋值后地址不变 → 很可能在内部缓冲区;若变,说明已转堆。std::string s = "abc" 后,s.capacity() 若返回 15/22/23 等固定小值,基本就是 SBO 缓冲区大小。注意:C++ 标准并未要求必须实现 SBO,它属于“允许但不强制”的优化(ISO C++ 标准只规定复杂度和异常安全)。但所有主流实现都做了。
SBO 好用,但别盲目依赖:
s += "a"; s += "b";)仍可能触发多次重分配(即使最终仍在 SBO 范围内),建议用 reserve() 预留或改用 std::string_view 拼接再构造。基本上就这些。SBO 是 STL 工程智慧的缩影:不改变接口,不动声色,却让千万行代码悄悄快了一截。
以上就是C++中的SBO(小字符串优化)是什么?std::string性能原理解析【STL源码】的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号