【问题标题】:What is the best solution to replace a new memory allocator in an existing code?在现有代码中替换新内存分配器的最佳解决方案是什么?
【发布时间】:2023-03-03 00:49:02
【问题描述】:

在过去的几天里,我获得了一些关于内存分配器的信息,而不是标准的malloc()。对于具有多线程的应用程序,有些实现似乎比malloc() 好得多。例如,tcmallocptmalloc 似乎性能更好。

我有一个 C++ 应用程序,它在很多地方都使用了 mallocnew 运算符。我认为用ptmalloc 之类的东西替换它们可能会提高它的性能。但我想知道new 运算符在 Linux 上运行的 C++ 应用程序中的作用是什么?它是使用malloc 的标准行为还是其他?

用代码中的旧内存分配器替换new 内存分配器的最佳方法是什么?有什么方法可以覆盖行为或newmalloc 还是我需要一一替换对它们的所有调用?

【问题讨论】:

  • 您是否确定您的程序花费大量时间进行内存管理?
  • 是的,确实如此。我已经确定了

标签: c++ linux memory-management


【解决方案1】:

我认为超载绝对是可能的。您可以将您的应用程序与您想要的新实现库链接起来,所有对 new、malloc 的调用都将被覆盖。我没有这样做。但我猜测它是可能的,因为在使用 valgrind 时,它使用自己的内存分配器来跟踪应用程序的内存使用统计数据并最终产生结果。所以如果可以的话,肯定有办法的。

检查此link。它包含有关 smartheap 库的类似信息!

【讨论】:

    【解决方案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

    【讨论】:

    • 你跳过了他们说的部分:LD_PRELOAD 很棘手,我们不一定推荐这种使用模式。
    • 没错,我做到了——因为我不想引用任何要领。详细文档在链接后面。
    【解决方案3】:

    如果您的程序是多线程的,那么Hoard 分配器将受到高度重视。不过,我个人认为在 Linux 上不值得费心,因为 glibcptmalloc 已经很不错了。

    【讨论】:

    • 我所说的代码使用了太多的 new 和 malloc 调用。 ptmalloc 在为 Linux 编译代码时实际上得到了调用?
    • 是的,如果您在 Linux 上工作,那么您已经在使用 ptmalloc。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      相关资源
      最近更新 更多