【发布时间】:2018-08-08 15:54:37
【问题描述】:
我遇到了在旧代码库中串联大量 CString 的问题。 CStrings 可以包含 base64 编码的文件,因此可能很大。在几个点上,这些 CString 像这样连接起来:
result += CString(_T("Some smaller String")) + Huge_CString + _T("Some smaller String");
这会导致多次分配,因此我们会遇到巨大的内存峰值。尽管这是在不同文件的多个线程上并行完成的。如果他们都在一起,我最终会得到“内存异常”。
处理此问题的最佳方法是什么。如果我可以减少已经有帮助的分配数量。现在我不是在寻找完美的解决方案,而是在寻找一种减少峰值的方法。
【问题讨论】:
-
A += B + C + D;很多临时字符串。A+=B; A+=C; A+=D;更少(无)临时字符串。 -
operator+会将 C 字符串强制转换为std::string,因此会导致如您所说的分配。也许您可以考虑使用一些 C 字符串 API,因为这些是 C 字符串,例如来自<cstring>的strcat或strncat? -
@Vivick 几乎
operator+被CString和 c-strings 重载;其余的都很好。 -
@Vivick 或者不要。基准字符串连接,包括代表您的动态内存管理,
std::string或CString与滚动您自己的并使用strcat和/或strncat之类的。 There's a reason,避免使用这些功能:长度确定。 -
@Richard Critten:对此进行了快速测试,没有区别
标签: c++ concatenation c-strings