覆盖标准 malloc
(和 new
) 可以通过动态或静态方式完成。
这是推荐的覆盖标准 malloc 接口的方式。
在这些基于 ELF 的系统上,我们预加载 mimalloc 共享库,因此对标准 malloc
接口的所有调用都将解析到 mimalloc 库。
您可以设置额外的环境变量来检查 mimalloc 是否正在运行,例如
或者运行调试版本以获取详细统计信息
在 macOS 上,我们也可以预加载 mimalloc 共享库,因此对标准 malloc
接口的所有调用都将解析到 mimalloc 库。
请注意,从shell 执行此操作时,可能会受到某些安全限制。
在 Windows 上动态覆盖 mimalloc 是可靠的,并且具有能够重定向所有通过(动态)C 运行时分配器进行的 malloc/free 调用的特殊优点,包括来自其他 DLL 或库的调用。由于它在低级别拦截所有分配调用,因此它可以可靠地用于包含其他第三方组件的大型程序。要使覆盖正常工作,需要满足四个要求:
/MD
或 /MDd
开关)。mimalloc.dll
的 mimalloc.lib
导出库。(尽管默认情况下,必须使用 -DMI_OVERRIDE=ON
编译此库)。为了确保 mimalloc.dll
在运行时实际加载,最简单的方法是在 main
函数中插入对 mimalloc API 的一些调用,例如 mi_version()
(或在链接器命令上使用 /include:mi_version
开关,或类似地,在某个源文件中使用 #pragma comment(linker, "/include:mi_version")
)。有关如何使用此功能的示例,请参阅 mimalloc-test-override
项目。mimalloc-redirect.dll
在运行时必须与主 mimalloc.dll
放在同一目录中(因为它是一个依赖项)。重定向 DLL 确保所有对 C 运行时 malloc API 的调用都被重定向到 mimalloc 函数(它们位于 mimalloc.dll
中)。mimalloc.dll
尽可能早地出现在最终可执行文件的导入列表中(这样它就可以拦截所有潜在的分配)。如果需要,您可以使用 minject -l
进行检查。为了在 Windows 上使用 C++ 获得最佳性能,还建议覆盖 new
/delete
操作(通过在项目中包含一个mimalloc-new-delete.h
单个(!)源文件)。
环境变量 MIMALLOC_DISABLE_REDIRECT=1
可用于在运行时禁用动态覆盖。使用 MIMALLOC_VERBOSE=1
来检查 mimalloc 是否成功重定向。
对于 x64 以外的平台,您可能需要特定的 [重定向 dll](bin)。此外,我们不能总是重新链接可执行文件或确保 mimalloc.dll
在导入表中排在第一位。在这种情况下,可以使用 [minject
](bin) 工具来修补可执行文件的导入表。
在类 Unix 系统上,您还可以静态链接 mimalloc 来覆盖标准 malloc 接口。推荐的方法是将最终程序与 mimalloc 单个目标文件 (mimalloc.o
) 链接。我们使用目标文件而不是库文件,因为链接器优先于归档文件解析符号。为了确保标准 malloc 接口解析到 mimalloc 库,请将其作为第一个目标文件链接。例如
另一种适用于所有平台的静态覆盖方式是静态链接到 mimalloc(如简介所示),并在每个源文件中包含一个头文件,将 malloc
等重新定义为 mi_malloc
。这由 mimalloc-override.h
提供。但这仅在所有源文件都在您的控制之下时才能可靠地工作,否则可能会发生来自不同堆的指针混合!
重定向到 mimalloc 库的特定函数是