我需要一种构建字符串的方法。我不知道大小,它必须非常有效。 今天我用这个:
std::strstreambuf* sBuf = new std::strstreambuf(20*1024*1024);
std::ostream* outS = new std::ostream(sBuf);
(*outS) << ... << ...
...
CString outputStr = (*outS).str();
在对此进行分析时,我可以看到 operator<< 需要很长时间。它的溢出函数被调用,并且需要很长时间(我的处理时间的 25%)。我不明白为什么
- 为什么会调用 overflow?为什么要花这么多时间?
- 有没有更有效的方法来做到这一点?
最佳答案
我假设 overflow
被调用,因为缓冲区中没有足够的空间。现在,当新分配的缓冲区再次只提供一个小的放大时,overflow
将很快再次被调用。
为了克服这种情况,可能值得使用自定义分配器实现 std::basic_stringbuf
,这反过来会分配更多空间或更智能地进行分配,例如如果以前的分配非常大,则分配更多等等。 “std compliant stringstream using stack allocated storage?”中提供了一个粗略的想法。
关于c++ - 如何编写高效的字符串缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20946352/