我正在使用字符串的自定义实现迁移旧代码库以使用std :: string。我们的一位工程师担心这会导致性能问题,我们使用+ =和+来连接相对较长的字符串。他特别关注的是当字符串动态增长时如何分配内存,他建议stringstream在这方面表现更好。对于那些想要回应“基准然后优化”或那些影响的情绪的人 - 我当然同意,那就是计划。我只是想知道这个理论。
我做了一点搜索这个问题,并遇到了这个问题: Efficient string concatenation in C++,这有点过时了。
现在我想知道:字符串+ =的内存分配算法是否真的不同于字符串流的内存分配算法?在上面的问题中提出的复制问题怎么样 - 用c ++ 11/14更改了这些?
答案 0 :(得分:1)
字符串+ =的内存分配算法是否真的不同于字符串流的内存分配算法?
是
字符串流写入stringbuffer,通常表示缓冲区的链接列表。内存不是连续的,随着缓冲区的增长,它不需要重新分配。
另一方面,一个字符串,在一个块中分配内存(根据需要,有时甚至是抢占式)。
最有效的解决方案可能是预先计算生成的字符串大小,手动分配结果,然后填入(使用std::string::operator +=
)。
那就是说,我会写入std :: ostringstream并在结尾处获取结果(但是YMMV)。