开源 内存分配器 mimalloc 在 windwos 的编译及使用
说明
网上关于这个牛逼的开源库教程很少,所以我写了一个我的理解
这里只谈论动态加载mimalloc完成内存分配器全局替换的办法
这样做,可以把你程序所有依赖的dll,的内存分配器都重定向到mimalloc,无需修改代码
mimalloc 的编译
源代码编译
下载mimalloc
vs2022打开方案,编译即可
上图即为需要的模块
使用
如果你的项目是多个dll组成,只需要在主程序属性管理器中配置即可
将mimalloc.dll\mimalloc-redirect.dll放在软件根目录
确认mimalloc.dll是首个加载
CMD中运行minject -l xxx.exe,查看是否第一个加载的是mimalloc.dll.
如上图(忽略名称,因为我是cmake编译),第一个加载就正常
然后在cmd中设置:set MIMALLOC_VERBOSE=1
运行程序
出现“mimalloc is redirected”即为正常运行.
为什么必须首个加载请查看文档 Dynamic Override on Windows
原理理解
issues #1101
在 Windows 上,由于每个 DLL/EXE(模块)都有自己的命名空间,因此C++中,应该在每个模块的某个 .cpp 文件中包含 #include < mimalloc-new-delete.h> 一次,以替换默认的 new/delete 实现以获得更好的性能。
但是,即使你没有包含 mimalloc-new-delete.h,基本的 malloc/free 拦截和替换是通过 mimalloc-redirect.dll 实现的,所以 mimalloc 的 malloc/free 仍然会被使用,只是在new\delete性能上不如#include < mimalloc-new-delete.h>.
在 Unix 系统上,在编译 mimalloc 时启用 MI_OVERRIDE=ON 就足够了,并且不需要包含 #include < mimalloc-new-delete.h>。