如何编写高效的字符串缓冲区
How to write an efficient string buffer
我需要一种方法来构建一个字符串。我不知道大小,它一定非常有效。今天我用这个:
std::strstreambuf* sBuf = new std::strstreambuf(20*1024*1024);
std::ostream* outS = new std::ostream(sBuf);
(*outS) << ... << ...
...
CString outputStr = (*outS).str();
在分析它时,我可以看到运算符<<需要很长时间。它的溢出函数被调用,并且需要很长时间(我的处理时间的 25%)。我不明白为什么
- 为什么调用溢出?为什么需要这么多时间?
- 有没有更有效的方法可以做到这一点?
我认为,overflow
被调用,因为缓冲区中没有足够的空间。现在,当新分配的缓冲区再次仅提供小幅扩展时,overflow
将很快再次调用。
为了克服这种情况,可能值得使用自定义分配器实现一个std::basic_stringbuf
,这反过来将分配更多空间或更智能地分配,例如,如果以前的分配非常大,则分配更多等等。"使用堆栈分配的存储进行符合 std 标准的字符串流?"中提供了一个粗略的想法。
相关文章:
- 如何使用字符串find_first_of缓冲区形式(size_t n 参数)
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 清除输入缓冲区后未提取字符串流
- 协议缓冲区字符串字段的文本编码
- 如何避免将数据缓冲区的额外副本复制到字符串?
- 在 node.js 中将缓冲区从 C++ 转换为 UTF-8 字符串
- 将指针作为缓冲区传递到第一个字符串元素
- 为什么在调用C#DLL时不需要提供字符串缓冲区
- 如何在C++中对静态缓冲区执行字符串格式化?
- 自动截断和 null 终止缓冲区溢出中的字符串缓冲区
- 使用字符串缓冲区文件名更改OFStream的目录
- 如何编写高效的字符串缓冲区
- 包装字符串缓冲区
- 字符串缓冲区如何导致运行恶意代码
- 缓冲区已满时清除字符串缓冲区.这是什么图案
- 为什么_splitpath_s()使用自定义大小的字符串缓冲区来返回驱动器号
- Cassandra cppdriver查询字符串缓冲区溢出
- 为二进制数据创建字符串缓冲区的最佳方法
- 将文件读入字符串缓冲区并检测 EOF
- C++DLL中的线程安全字符串缓冲区变量