如何编写有效的字符串缓冲区

时间:2014-01-06 09:02:29

标签: c++ string performance buffer

我需要一种方法来构建一个字符串。我不知道它的大小,它必须非常有效。 今天我用这个:

std::strstreambuf* sBuf = new std::strstreambuf(20*1024*1024);
std::ostream* outS = new std::ostream(sBuf);
(*outS) << ... << ...
... 
CString outputStr = (*outS).str();

在对此进行分析时,我可以看到该运算符&lt;&lt;需要很长的时间。它的溢出函数被调用,并且需要很长时间(我的处理时间的25%)。我不明白为什么

  1. 为什么要调用溢出?为什么需要这么多时间?
  2. 有更有效的方法吗?

1 个答案:

答案 0 :(得分:0)

我假设,overflow被调用,因为缓冲区中没有足够的空间。现在,当新分配的缓冲区再次只提供一个小放大时,overflow将很快再次被调用。

为了克服这种情况,可能值得使用自定义分配器实现std::basic_stringbuf,而自定义分配器又会分配更多空间或更智能地进行分配,例如:如果先前的分配非常大,则分配更多,依此类推。 “std compliant stringstream using stack allocated storage?”中提供了一个粗略的想法。