stringstream如何在内部工作?

lam*_*pak 5 c++ stringstream standard-library

我问的是性能方面的问题.stringstream只是一个字符串/向量,因此写入它可能会导致其整个内容被复制到更大的内存块,或者是以更棘手的方式完成(比如,字符串列表或其他什么)?

Ste*_*sop 5

27.7.3/1 说basic_ostringstream使用basic_stringbuf. 我认为 27.7.1.3/8 说basic_stringbuf通过重新分配缓冲区来腾出空间,甚至不能保证指数增长(因此摊销 O(1) 以追加)。

但我发现标准的流部分非常难以理解,而且总是有“as-if”规则。所以我不能向你保证deque实际上禁止使用底层(并在有人要求字符串/缓冲区时进行合并)。


ust*_*sta 4

如何实现 stringstream (或任何与此相关的库功能)取决于标准库供应商。您可以查看编译器附带的 sstream 标头,了解它是如何实现的。理论上就这么多了......

据实际经验和测量结果显示,与其他将数据格式化为字符串的方法相比,ostringstream 通常速度较慢。但话又说回来,只有在你测量到你要优化的确实是性能瓶颈之后才进行优化,否则充其量只是浪费时间。

如果您的测量结果表明 ostringstream 的性能确实对您来说是个问题,请考虑使用Boost.Karma。当然,使用 Boost.Karma 的原因不仅仅是性能,因此,如果您要开始编写新代码而不是想使用字符串流修改现有代码,那么您可能希望从一开始就使用 Karma。