在文件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"))();