构建
首选用法是包含 <mimalloc.h>
,链接共享或静态库,并专门使用 mi_malloc
API 进行分配。例如,
gcc -o myprogram -lmimalloc myfile.c
mimalloc 仅使用安全的操作系统调用(mmap
和 VirtualAlloc
),并且可以与链接到同一程序的其他分配器共存。如果您使用 cmake
,您可以简单地在 CMakeLists.txt
中使用
find_package(mimalloc 2.1 REQUIRED)
来查找本地安装的 mimalloc。然后使用
target_link_libraries(myapp PUBLIC mimalloc)
来链接共享(动态)库,或者
target_link_libraries(myapp PUBLIC mimalloc-static)
来链接静态库。有关示例,请参见 test\CMakeLists.txt
。
C++
为了在 C++ 程序中获得最佳性能,还建议重载全局 new
和 delete
运算符。为方便起见,mimalloc 提供了 mimalloc-new-delete.h
,它可以为您完成此操作——只需将其包含在您项目中的单个(!)源文件中。
在 C++ 中,mimalloc 还提供了 mi_stl_allocator
结构,它实现了 std::allocator
接口。例如
std::vector<some_struct, mi_stl_allocator<some_struct>> vec;
vec.push_back(some_struct());
统计
您可以传递环境变量来打印详细消息(MIMALLOC_VERBOSE=1
)和统计信息(MIMALLOC_SHOW_STATS=1
)(在调试版本中)
> env MIMALLOC_SHOW_STATS=1 ./cfrac 175451865205073170563711388363
175451865205073170563711388363 = 374456281610909315237213 * 468551
堆统计:峰值 总计 释放 单元
normal 2: 16.4 kb 17.5 mb 17.5 mb 16 b ok
normal 3: 16.3 kb 15.2 mb 15.2 mb 24 b ok
normal 4: 64 b 4.6 kb 4.6 kb 32 b ok
normal 5: 80 b 118.4 kb 118.4 kb 40 b ok
normal 6: 48 b 48 b 48 b 48 b ok
normal 17: 960 b 960 b 960 b 320 b ok
堆统计:峰值 总计 释放 单元
normal: 33.9 kb 32.8 mb 32.8 mb 1 b ok
huge: 0 b 0 b 0 b 1 b ok
total: 33.9 kb 32.8 mb 32.8 mb 1 b ok
malloc requested: 32.8 mb
committed: 58.2 kb 58.2 kb 58.2 kb 1 b ok
reserved: 2.0 mb 2.0 mb 2.0 mb 1 b ok
reset: 0 b 0 b 0 b 1 b ok
segments: 1 1 1
-abandoned: 0
pages: 6 6 6
-abandoned: 0
mmaps: 3
mmap fast: 0
mmap slow: 1
threads: 0
elapsed: 2.022s
process: user: 1.781s, system: 0.016s, faults: 756, reclaims: 0, rss: 2.7 mb
然而,在使用标准 malloc 接口的现有程序中,上述使用 mi_
前缀 API 的模型并不总是可行,另一种选择是完全重载标准 malloc 接口并将所有调用重定向到 mimalloc 库。
有关更多信息,请参阅 重载 Malloc。