我在性能方面询问。 stringstream只是一个字符串/向量,所以写入它可能会导致其整个内容被复制到更大的内存块,或者是以更棘手的方式完成(比如,字符串列表或其他什么)?
答案 0 :(得分:4)
27.7.3 / 1表示basic_ostringstream
使用basic_stringbuf
。我认为27.7.1.3/8说basic_stringbuf
通过重新分配缓冲区来腾出空间,甚至不能保证指数增长(因此可以追加摊销的O(1))。
但是我发现标准的流部分非常难以理解,并且始终存在“as-if”规则。所以我不能保证你在下面使用deque
(当有人要求字符串/缓冲区时合并)实际上是被禁止的。
答案 1 :(得分:3)
标准库供应商如何实现stringstream(或任何库功能)。您可以查看编译器附带的sstream标头,了解它是如何在那里实现的。在理论方面那么多......
就实际经验和测量结果而言,与将数据格式化为字符串的其他方法相比,ostringstream通常很慢。但话说回来,只有在你测量出你想要优化的东西确实是性能瓶颈之后才进行优化,否则这只会浪费时间。
如果您的测量显示ostringstream的性能确实对您有用,请考虑使用Boost.Karma。当然,使用Boost.Karma还有更多的理由而不仅仅是性能,所以如果你开始使用新的代码而不想使用字符串流修改现有的代码,你可能希望从一开始就使用Karma。