在现有代码中替换新内存分配器的最佳解决方案是什么?

时间:2009-10-05 12:23:15

标签: c++ linux memory-management

在过去的几天里,我获得了除标准malloc()以外的内存分配器的一些信息。对于具有许多线程的应用程序,有些实现似乎比malloc()好得多。例如,似乎tcmallocptmalloc具有更好的效果。

我有一个C ++应用程序,在许多地方使用mallocnew运算符。我认为用ptmalloc之类的东西替换它们可能会改善它的性能。但我想知道new运算符在Linux上运行的C ++应用程序中如何运行?它是否使用malloc或其他标准行为?

用代码中的旧内存分配器替换new内存分配器的最佳方法是什么?有没有办法覆盖行为或newmalloc或者我是否需要逐个替换所有调用?

4 个答案:

答案 0 :(得分:2)

来自TCMalloc documentation

  

要使用TCmalloc,只需通过“-ltcmalloc”链接器标志将tcmalloc链接到您的应用程序。   您可以使用LD_PRELOAD:

在未编译的应用程序中使用tcmalloc      

$ LD_PRELOAD =“/ usr / lib / libtcmalloc.so”

ptmalloc似乎是相似的(但如果你在Linux上,你可能已经在使用它because it's part of the GNU C library)。

我希望operator new能够拨打malloc,但您可以通过在malloc上设置断点,然后调用new来轻松检查自己。如果您的new未致电mallocyou can redefine it so that it does

答案 1 :(得分:1)

如果您的程序是多线程的,则Hoard分配器受到高度重视。我个人认为不值得在Linux上打扰,因为glibc的ptmalloc已经相当不错了。

答案 2 :(得分:0)

我认为过度骑行绝对是可能的。您可以将您的applciation链接到您想要的新实现库,并且将覆盖对new,malloc的所有调用。我没有这样做。但我猜它是可能的,因为当使用valgrind时,它使用自己的内存分配器来跟踪应用程序的内存使用情况统计信息并最终生成结果。所以,如果可以,肯定应该有办法。

检查link。它包含有关类似智能堆库的信息!

答案 3 :(得分:0)

您的应用在内存分配上花了多少时间?