关于stringstream缓冲区的问题本帖最后由 lk723 于 2012-12-10 22:02:45 编辑看了网上很多资料说stringstr
关于stringstream缓冲区的问题
本帖最后由 lk723 于 2012-12-10 22:02:45 编辑 看了网上很多资料说stringstream只有在析构的时候才会清空它的缓冲区
想手动清除必须用ss.str("")再clear
然后还有人做了不断往stringstream里插数据的实验
比如
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
stringstream ss;
string str;
while (1)
{
ss << "test";
//str = ss.str();
//cout << ss.str();
}
return 0;
}
12和13行注释掉的时候内存占用会很快地增长
如果去掉12行的注释,内存会占用会比较缓慢地增长
而如果去掉13行的注释,内存占用一直维持一个很低的数值
我想知道,这三种情况分别发生了什么,stringstream的缓冲区到底是怎么样的
还有,为什么将ss.str()插入标准输出流会使stringstream的内存占用值很低?ss.str()不是只是返回一个副本而已吗?
[解决办法]“看了网上很多资料说stringstream只有在析构的时候才会清空它的缓冲区
想手动清除必须用ss.str("")再clear”
以上讲述是正确的。
与STL的实现有关。
ss << "test"; //这句内存如何增长取决于std::streambuf的实现,请看源码
str = ss.str(); //这句内存如何增长取决于std::string的实现,请看源码
cout << ss.str();//这句内存如何增长取决于std::string的实现,请看源码如果用引用计数,写时拷贝机制,内存不增长。
[解决办法]不算不知道,一算吓一跳
第1次
str test
第2次
str testtest
第3次
str testtesttest
...
第5000000次
str test重复5000000
平均一个str的大小是:str=(1+5000000)/2 * 4 = 10000002,大约为10MB
一共5000000次,数据量达到5000000*10MB=50000GB
内存读写一秒钟一个G,也需要50000秒,这时间...
[解决办法]测试了一下时间,cout<<ss.str();加上后的时间消耗变成了几千甚至上万倍
可以负责任的说,cout在这里的作用仅仅是拖慢内存增长的速度
[解决办法]12和13行注释掉的时候内存占用会很快地增长
stringstream通过stringbuf来维护缓冲区。如果你不停地插入 那么也就意味着stringbuf维护的内存越来越大
如果去掉12行的注释,内存会占用会比较缓慢地增长
这里缓慢的增长 只是说cout本身的缓冲区接收了来自ss缓冲区的数据。至于之后不停地ss<<"test",要看stringstream的str的实现是否清空缓存然后后期插入的test可能是在原来清空的缓存基础上。缓慢的增长应该是cout对象的缓存的增长 你可以写成cout<<ss.str()<<endl;再看看
而如果去掉13行的注释,内存占用一直维持一个很低的数值
因为ss的缓冲区的数据不断的刷新,ss<<"test"没有什么影响。
[解决办法]意思就是说, 看代码分析原因。
你只保留ss << "test";后内存快速增长的原因是:没有IO操作,单位时间内执行更多次 ss << "test";
你应该关心speed = 内存增量/循环次数,而不是speed = 内存增量/时间