TCMalloc 覆盖所有分配/解除分配函数调用,包括 New/Delete 的所有变体,以及 C API (malloc/免费的/calloc/realloc/valloc/pvalloc/mem_aligned /malloc_usable_size)
对于基于 gcc 的平台,它使用别名指令实现覆盖。
我使用了很多 C++ 新的等,所以仅 #defining malloc to tcmalloc 是行不通的
在 TCMalloc 标头中,malloc 已经别名为 tc_malloc,所以这没有任何作用。例如:
#define ALIAS(tc_fn) __attribute__ ((alias (#tc_fn), used))
void* malloc(size_t size) __THROW ALIAS(tc_malloc)
至于New,请注意,与glibc和其他New(windows)的实现不同,它只是包装了malloc,tcmalloc的New不调用malloc。
TCMalloc New 是 tc_new 和 tc_newarray 的别名,这将调用 TCMalloc 的“神奇”内存管理器,在某些情况下,作为 libc malloc,将启动一个 sbrk/brk 系统调用。
您需要做的另一件事是确保 gcc 不与 libc 的 malloc 变体链接。为此,请在 Makefile 中的 C++ 标志中添加以下内容:
-fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
另外,别忘了指定 TCMalloc 静态库:
LIB_TCMALLOC = $(TCMALLOC_LIB_DIR)/libtcmalloc_minimal.a
LIB_DIR := .... -L$(TCMALLOC_LIB_DIR) ...
LIBS := ... -static $(LIB_TCMALLOC) ...
可能我必须自己使用 malloc_hook,但我原以为我可以让 tcmalloc 为我做这件事,因为它显然是在动态链接时做的
TCMalloc 不使用 malloc_hooks,由于线程安全问题,它现在被认为已弃用。它只是利用了内存分配方法是弱符号的事实。它通过函数调用使用别名(在 gcc 中)__attribute__((alias)) 覆盖这些符号。
请参考:
https://github.com/gperftools/gperftools/blob/master/README