知识卡片

短字符串可能移不快

普通读书笔记卡 · 1431

内容

小字符串优化将短内容保存在字符串对象内部,减少堆分配;移动这些内嵌字符仍需复制数据,所以未必比复制更快。具体短字符串阈值取决于实现,不能把某个阈值写成标准保证,性能结论要看对象实际存储布局。

参考来源

- 位置:《Effective Modern C++》第5章《右值引用,移动语义,完美转发》,条款二十九:假定移动操作不存在,成本高,未被使用(源文件:_epub-src/EPUB/text/ch006.xhtml) - 结论依据:原文直接以SSO解释内嵌缓冲如何改变移动成本,并将其描述为许多实现采用的优化。 - 原始内容:另一方面, std::string 提供了常数时间的移动操作和线性时间的复制操作。这听起来移动比复制快多了,但是可能不一定。许多字符串的实现采用了小字符串优化( small string optimization ,SSO)。“小”字符串(比如长度小于15个字符的)存储在了 std::string 的缓冲区中,并没有存储在堆内存,移动这种存储的字符串并不必复制操作更快。