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



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

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

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

  1. 为什么调用溢出?为什么需要这么多时间?
  2. 有没有更有效的方法可以做到这一点?

我认为,overflow被调用,因为缓冲区中没有足够的空间。现在,当新分配的缓冲区再次仅提供小幅扩展时,overflow将很快再次调用。

为了克服这种情况,可能值得使用自定义分配器实现一个std::basic_stringbuf,这反过来将分配更多空间或更智能地分配,例如,如果以前的分配非常大,则分配更多等等。"使用堆栈分配的存储进行符合 std 标准的字符串流?"中提供了一个粗略的想法。

最新更新