在文件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库,根据安装说明不建议这样做:



因此,显然不能通过上述典型方法来访问扩展。我可以使用malloc_extensions_c.h中声明的C版本,但是只是想知道是否有更好的解决方案。

最佳答案

我设法通过一些“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"))();

09-30 16:51
查看更多