【发布时间】:2010-10-25 21:47:07
【问题描述】:
使用多个 DLL 和 QT 的 C++ 程序应配备 malloc 替代品(如 tcmalloc),以解决可验证为由 Windows malloc 引起的性能问题。 linux 没问题,windows 有好几种方法,我觉得没有一个吸引人:
1.将新的 malloc 放入 lib 并确保首先链接它(Other SO-question)
这有一个缺点,例如strdup will still use the old malloc and a free may crash the program。
2。使用 lib.exe (Chrome) 从静态 libcrt 库中删除 malloc
这是为chrome/chromium 测试/使用的(?),但缺点是它仅适用于静态链接crt。如果一个系统库与 msvcrt 动态链接,则静态链接会出现问题,可能有mismatches in the heap allocation/deallocation。如果我理解正确,tcmalloc 可以动态链接,这样所有自编译的 dll 都有一个公共堆(这很好)。
3.补丁crt-源码(firefox)
Firefox's jemalloc 显然修补了 windows CRT 源代码并构建了一个新的 crt。这又出现了上面的静态/动态链接问题。
可以考虑使用它来生成动态 MSVCRT,但我认为这是不可能的,因为许可证禁止提供具有相同名称的修补 MSVCRT。
4.在运行时动态修补加载的 CRT
一些商业内存分配器可以做到这一点。 tcmalloc 也可以,但这看起来相当难看。它有一些问题,但它们已得到修复。目前,tcmalloc 不能在 64 位窗口下工作。
有更好的方法吗?有cmets吗?
【问题讨论】:
-
那么您使用了哪种方法?您使用哪一个来验证备用分配器比 CRT malloc 提供的分配器工作得更好的断言?您使用了哪个版本的 CRT,它与新版本更好/更差/相同吗?
-
为什么不尝试替换全局 C++ 新的呢?这不可行(并匹配共享库 + 应用程序主二进制文件 + ms crt 作为共享库设置)?
标签: windows dll malloc msvcrt crt