tcmalloc とは
Google 製のメモリチェックライブラリ gperftools の一部. 高速なアロケーションを売りにしている.
既存のコードを書き換えずに, tcmalloc.so をリンクしてビルドするだけで, malloc が tc_malloc に差し替わり, プログラムの高速化が期待できる. 特に VC++ のを差し替えるとびっくりする.
課題
しかしながら勝手に差し替えられたくないこともある. tcmalloc を選択的に利用するにはどうすればよいか.
解法
上記サイトからソースを取ってくる
% curl -O https://gperftools.googlecode.com/files/gperftools-2.1.tar.gz
% tar xf gperftools-2.1.tar.gz
% cd gperftools
src/tcmalloc.cc の900行目くらいにある変数をコメントアウトする.
TCMallocGuard のコンストラクタでデフォルトランタイムの関数を差し替えているので, コンストラクトしないようにする.
#ifndef WIN32_OVERRIDE_ALLOCATORS
-static TCMallocGuard module_enter_exit_hook;
+//static TCMallocGuard module_enter_exit_hook;
#endif
そしてビルド(make or msbuild).
使うときは gperftools/tcmalloc.h をインクルードする.
#include <gperftools/tcmalloc.h>
// ...
char* p = (char*)tc_malloc(1024);
tc_free(p);
これで通常 malloc と tc_malloc の共存ができた. ただし VC++ 環境でしか試してません.
2014/11/07 追記: OS X 上の Clang でも有効でした.