一个使用多个DLL和QT的C++程序应该配备一个malloc替代方案(如tcmalloc),以解决可以验证是由Windows malloc引起的性能问题。对于Linux,没有问题,但在Windows上,有几种方法,我发现都不令人满意:
1. 在lib中添加新的malloc,并确保将其链接至最前(其他SO问题)。
这样做的缺点是,例如strdup仍将使用旧的malloc,可能会导致程序崩溃。
2. 使用lib.exe从静态libcrt库中删除malloc (Chrome)
这被测试/用于chrome/chromium,但缺点是它只适用于静态链接crt。静态链接存在问题,如果一个系统库动态链接到msvcrt,就可能出现堆分配/释放不匹配的情况。如果我理解正确,tcmalloc可以被动态链接,使得所有自编译的dll都拥有一个共同的堆(很好)。
3. 修改crt源代码(firefox)
Firefox的jemalloc显然会修改Windows CRT源代码并构建新的CRT。这再次出现了上面提到的静态/动态链接问题。
我们可以考虑使用这个功能来生成动态MSVCRT,但我认为这不可能,因为许可证禁止提供具有相同名称的修补程序MSVCRT。
4. 在运行时动态修改已加载的CRT
一些商业内存分配器可以做到这一点。tcmalloc也可以,但这似乎相当丑陋。它曾经存在一些问题,但已经解决了。目前,在64位Windows下使用tcmalloc无法正常工作。
有更好的方法吗?任何评论?