使用tcmalloc - 如何正确加载malloc扩展?

时间:2014-07-08 06:18:40

标签: c++ c linux malloc tcmalloc

在文件gperftools-2.2.1 / src / gperftools / malloc_extension.h中,它显示为:

// Extra extensions exported by some malloc implementations.  These
// extensions are accessed through a virtual base class so an
// application can link against a malloc that does not implement these
// extensions, and it will get default versions that do nothing.
//
// NOTE FOR C USERS: If you wish to use this functionality from within
// a C program, see malloc_extension_c.h.

我的问题是如何通过虚拟基类访问这些扩展?

通常从动态库加载一个类,我需要编写一个基类,它允许我通过多态来获取所需类的实例及其函数,如here所述。

但是要这样做,API中必须有一些类工厂函数,但在任何tcmalloc文件中都没有这样的函数。此外,我还需要使用dlopen()加载tcmalloc库,根据安装说明不推荐使用:

  

...通过dlopen加载malloc替换库是   在任何情况下都要求麻烦:一些数据将分配一个malloc,一些数据与另一个分配。

如此清楚地通过上述典型方式访问扩展不是一种选择。我可以使用malloc_extensions_c.h中声明的C版本,但只是想知道是否有更好的解决方案。

2 个答案:

答案 0 :(得分:0)

我设法通过一些'hack'加载malloc扩展,这不像我想的那样干净,但它完成了工作。对于那些感兴趣的人来说,这是(临时)解决方案。

首先,大多数这些malloc扩展函数类似于静态函数,它们大多只在当前实例上调用,例如,要调用当前进程的GetMemoryReleaseRate()函数,只需调用MallocExtension::instance()->GetMemoryReleaseRate()。因此,我们不需要创建基类并获取MallocExtension类的实例来调用这些函数。

对于上面的示例,我只创建一个独立函数getMemoryReleaseRate(),它在调用时只调用所需的函数,如下所示:

getMemoryReleaseRate()
{
    MallocExtension::instance()->GetMemoryReleaseRate();
}

此功能可以直接插入源文件,例如tcmalloc.cc,或者,如果您不想在每次有新版本时编辑tcmalloc源,请添加到生成文件中,以便在编译时附加到源文件。

现在在您的代码中,您可以通过dlsym()创建的'facade'函数调用MallocExtension函数,例如:如下:

typedef void (*getMemoryReleaseRate)(); 
((getMemoryReleaseRate)dlsym(RTLD_DEFAULT, "getMemoryReleaseRate"))();

答案 1 :(得分:0)

只需包含此标头并执行MallocExtension :: instance() - > GetMemoryReleaseRate();也会工作。无需为此修改tcmalloc。