C++ 巨大 CString 的串联
C++ Concatenation of Huge CStrings
我在遗留代码库中连接大型CStrings时遇到了问题。CStrings 可以包含 base64 编码的文件,因此可能很大。在几个点上,这些 CString 是这样连接的:
result += CString(_T("Some smaller String")) + Huge_CString + _T("Some smaller String");
这会导致多次分配,因此我们得到了巨大的内存峰值。尽管这是在不同文件的多个线程上并行完成的。如果它们都聚集在一起,我最终会得到"记忆例外"。
处理这个问题的最佳方法是什么。如果我能减少已经有帮助的分配数量。现在我不是在寻找完美的解决方案,而是在寻找一种减少峰值的方法。
对于编辑大字符串,您可能希望使用非连续类型rope
或unencoded_rope
- 线程安全、写入时复制或插入中间成本低的字符串类型。
我会建议与Remy Lebeau基本相同,但使用一些不同的函数。 我不确定哪个版本的MFC/ATL引入了CString::P re分配功能,因此您可能被困在没有此功能的MFC/ATL版本上。
CString result(_T("Initial string "));
CString prefix(_T("Prefix string:"));
CString suffix(_T(":Suffix string"));
CString bigString(_T("This really isn't very big."));
auto totalLength = result.GetLength() + prefix.GetLength() + bigString.GetLength() + suffix.GetLength();
result.Preallocate(totalLength);
result += prefix.GetString();
result += bigString.GetString();
result += suffix.GetString();
对 CString::GetString 的调用可能有用,也可能没有用。 只需将每个子字符串附加到 result
中,您可能会获得相同的分配行为。
预先分配所需级联长度的单个CString
,然后将较小字符串中的数据复制到其内部缓冲区中,例如:
CString Huge_CString = ...;
LPCTSTR ss1 = TEXT("Some smaller String");
LPCTSTR ss2 = TEXT("Some smaller String");
int ss1_len = lstrlen(ss1);
int huge_len = Huge_CString.GetLength();
int ss2_len = lstrlen(ss2);
int concat_len = ss1_len + huge_len + ss2_len;
CString Concat_CString;
PXSTR buffer = Concat_CString.GetBufferSetLength(concat_len);
CString::CopyChars(buffer, ss1, ss1_len);
buffer += ss1_len;
CString::CopyChars(buffer, Huge_CSString.GetBuffer(), huge_len);
buffer += huge_len;
CString::CopyChars(buffer, ss2, ss2_len);
Concat_CString.ReleaseBuffer(total_len);
// use Concat_CString as needed...
相关文章:
- 在linux上调试巨大的C++项目
- 在C++中使用Cstring反转字符串
- GCC 和 Clang 代码性能的巨大差异
- 如何转换真实路径 CString c++
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- __int64 CString 返回错误的值 - C++ MFC
- 如何将 SHFileOperation() 与 CString 路径一起使用
- 将数字提高到一个巨大的指数
- 在_T值中使用 CString
- 没有大小参数的CString::GetBuffer()做什么
- 巨大的内存分配:堆栈与堆
- 如何将 CString 转换为字节 [] 数组?
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 在 v8 JavaScript 中重复调用C++是否有巨大的开销?
- 可视化 如何将 CString 值列表添加到 MFC C++ 中的组合框中?
- 未来值公式显示疯狂巨大数字的输出
- C++从 std::string 创建 CString 失败
- 对树节点使用 CString 时出现内存泄漏
- C++ 巨大 CString 的串联
- 使用C++对一个巨大文件中的文本行进行字典式外部排序