在过去的几天里,我获得了除标准malloc()
以外的内存分配器的一些信息。对于具有许多线程的应用程序,有些实现似乎比malloc()
好得多。例如,似乎tcmalloc
和ptmalloc
具有更好的效果。
我有一个C ++应用程序,在许多地方使用malloc
和new
运算符。我认为用ptmalloc
之类的东西替换它们可能会改善它的性能。但我想知道new
运算符在Linux上运行的C ++应用程序中如何运行?它是否使用malloc
或其他标准行为?
用代码中的旧内存分配器替换new
内存分配器的最佳方法是什么?有没有办法覆盖行为或new
和malloc
或者我是否需要逐个替换所有调用?
答案 0 :(得分:2)
要使用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
未致电malloc
,you can redefine it so that it does。
答案 1 :(得分:1)
如果您的程序是多线程的,则Hoard分配器受到高度重视。我个人认为不值得在Linux上打扰,因为glibc的ptmalloc已经相当不错了。
答案 2 :(得分:0)
我认为过度骑行绝对是可能的。您可以将您的applciation链接到您想要的新实现库,并且将覆盖对new,malloc的所有调用。我没有这样做。但我猜它是可能的,因为当使用valgrind时,它使用自己的内存分配器来跟踪应用程序的内存使用情况统计信息并最终生成结果。所以,如果可以,肯定应该有办法。
检查link。它包含有关类似智能堆库的信息!
答案 3 :(得分:0)
您的应用在内存分配上花了多少时间?