std::string 运算符 + 与 stringstream 的性能

Spa*_*ose 6 c++ string

我正在将旧代码库从使用字符串的自定义实现迁移到使用 std::string。我们的一位工程师担心这可能会导致我们使用 += 和 + 连接相对较长的字符串时出现性能问题。他特别关心的是随着字符串的动态增长如何分配内存,他建议 stringstream 在这方面表现得更好。对于那些试图回应“基准然后优化”或对这些效果的看法的人 - 我当然同意,这就是计划。我只是想知道这个理论。

我对这个问题做了一些搜索,并遇到了这个问题: Efficient string concatenation in C++,这有点过时了。

现在我想知道:字符串 += 的内存分配算法真的与字符串流的不同吗?上面问题中提出的复制问题怎么样——这些问题在 C++ 11/14 中发生了变化吗?

utn*_*tim 10

string += 的内存分配算法与字符串流的内存分配算法真的不同吗?

是的。

字符串流写入字符串缓冲区,这通常意味着缓冲区的链接列表。内存不是连续的,并且随着缓冲区的增长不需要重新分配。

另一方面,字符串在单个块中分配内存(根据需要,有时是抢占式的)。

最有效的解决方案可能是预先计算结果字符串大小,手动分配结果,然后填充它(使用std::string::operator +=)。

也就是说,我只需写入 std::ostringstream 并在最后获取结果(但 YMMV)。