我需要一种方法来构建一个字符串。我不知道它的大小,它必须非常有效。 今天我用这个:
std::strstreambuf* sBuf = new std::strstreambuf(20*1024*1024);
std::ostream* outS = new std::ostream(sBuf);
(*outS) << ... << ...
...
CString outputStr = (*outS).str();
在对此进行分析时,我可以看到该运算符&lt;&lt;需要很长的时间。它的溢出函数被调用,并且需要很长时间(我的处理时间的25%)。我不明白为什么
答案 0 :(得分:0)
我假设,overflow
被调用,因为缓冲区中没有足够的空间。现在,当新分配的缓冲区再次只提供一个小放大时,overflow
将很快再次被调用。
为了克服这种情况,可能值得使用自定义分配器实现std::basic_stringbuf
,而自定义分配器又会分配更多空间或更智能地进行分配,例如:如果先前的分配非常大,则分配更多,依此类推。 “std compliant stringstream using stack allocated storage?”中提供了一个粗略的想法。