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

标签 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 库,根据安装说明不推荐这样做:

...loading a malloc-replacement library via dlopen is asking for trouble in any case: some data will be allocated with one malloc, some with another.

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

最佳答案

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

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

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

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

这个函数可以直接插入源文件,例如tcmalloc.cc,或者,如果您不想在每次有新版本时编辑 tcmalloc 源代码,将其添加到您的 makefile 中,以便在编译时附加到源文件。

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

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

关于c++ - 使用 tcmalloc - 如何正确加载 malloc 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24624913/

相关文章:

c++ - 无法访问同一类的私有(private)成员

c - 设置共享变量时应该使用临界区还是内存屏障?

c - 效率 : arrays vs pointers

linux - shell脚本背景

linux - 将文件转换为 UTF-8 并保留修改时间戳

linux - rtmpdump 通过命令行检查状态

C++ 错误 : Not declared in scope; Member function

c++ - OpenGL 中的镜面照明问题

c++ - 使用内联方法和类从 header 创建 .cpp 文件

java - 来自 Java 的 clang 的 `pkg-config` 参数