在过去的几天中,我已经获得了有关除标准malloc()
之外的内存分配器的一些信息。 对于有很multithreading的应用程序来说,有些实现似乎比malloc()
好得多。 例如,似乎tcmalloc
和ptmalloc
有更好的性能。
我有一个C ++应用程序,在许多地方同时使用malloc
和new
操作符。 我认为用ptmalloc
等replace它们可能会提高它的性能。 但是我想知道在运行在Linux上的C ++应用程序中, new
操作符是如何操作的? 它使用malloc
或其他的标准行为吗?
在代码中用旧代码replacenew
内存分配器的最好方法是什么? 有没有什么办法来覆盖的行为或new
malloc
或我是否需要逐一replace所有的电话?
从TCMalloc文档 :
要使用TCmalloc,只需通过“-ltcmalloc”链接器标志将tcmalloc链接到您的应用程序。 您可以使用LD_PRELOAD在您自己编译的应用程序中使用tcmalloc:
$ LD_PRELOAD =“/ usr / lib / libtcmalloc.so”
ptmalloc似乎是相似的(但如果你在Linux上,你可能已经在使用它, 因为它是GNU C库的一部分 )。
我希望operator new
可以调用malloc
,但是你可以通过在malloc
上设置断点,然后调用new
来轻松地检查自己。 如果你的new
不调用malloc
, 你可以重新定义它,这样做 。
如果你的程序是多线程的,那么Hoard的分配器是非常重视的。 我个人不认为在Linux上这是值得的,因为glibc的ptmalloc已经很不错了。
我认为骑马绝对有可能。 您可以将您的应用程序与所需的新实现库链接起来,所有对新的malloc的调用都将被重写。 我没有那样做。 但我猜测它的可能性,因为在使用valgrind时,它使用自己的内存分配器来跟踪应用程序的内存使用情况统计信息,并最终产生结果。 所以如果可以的话,肯定应该有办法。
检查这个链接 。 它包含有关类似类型的smartheap库的信息!
你的应用在内存分配上花了多少时间?