带有jemalloc的C++ STL

Kov*_*Bal 11 c++ malloc memory-management stl

如何使用带有jemalloc(或任何其他malloc实现)的C++ STL容器?

它是否像包含一样简单jemalloc/jemalloc.h?或者我应该为他们写一个分配器?

编辑:我正在处理的应用程序在其生命周期内分配和释放相对较小的对象.我想替换默认的分配器,因为基准测试显示应用程序不会超过2个核心.分析显示它正在等待内存分配,这就是导致扩展问题的原因.据我了解,jemalloc将有助于此.


我希望看到一个解决方案,这是平台中立的,因为应用程序必须在Linux和Windows上运行.(在Linux下,链接不同的实现很容易,但据我所知,在Windows上很难实现.)

MSa*_*ers 9

C++允许您替换 operator new.如果这个替换operator new调用je_malloc,那么std::allocator将间接调用je_malloc,反过来所有标准容器都会.

这是迄今为止最简单的方法.编写自定义分配器需要编写整个类.更换malloc可能还不够(不能保证未更换的operator new电话malloc),并且它具有Adrian McCarthy先前提到的风险


Kov*_*Bal 6

如果你想替换malloc程序中的任何地方(我想要并且似乎也是唯一的逻辑解决方案),那么你所要做的就是链接它.

所以,如果你使用gcc那么你所要做的就是:

g++ yourprogram.cpp -ljemalloc
Run Code Online (Sandbox Code Playgroud)

但是,如果它是不可能的,那么你就必须通过其他的功能如使用jemalloc je_mallocje_free,然后你必须重载newdelete运营商.

如果您不使用特定于实现的功能(主要是统计信息),则不需要包含任何标头.


Adr*_*thy 5

编写分配器将是最简单的解决方案,因为 stl 被设计为具有可互换的分配器。这将是最简单的路径。

一些项目玩游戏试图获得替代malloc实现来替换编译器的配套库提供的mallocand new。这很容易出现各种问题,因为您最终会依赖编译器的特定实现细节及其通常使用的库。这条路充满了危险。

尝试malloc全局替换的一些危险:

  • 静态初始化顺序在 C++ 中的保证有限。除非您禁止可能分配内存的静态对象,否则无法保证在第一个调用者尝试使用它之前初始化分配器替换。运行时没有这个问题,因为编译器和运行时一起工作以确保在初始化任何静态之前完全初始化运行时。
  • 如果动态链接到运行时库,则无法确保运行时库的某些代码尚未绑定到其自己的实现。在重新分发应用程序时,尝试修改编译器的运行时库可能会导致许可问题。
  • 所有其他分配方法可能并不总是最终依赖于malloc. 例如,一个实现new可能会绕过malloc大量分配并直接调用操作系统来分配内存。这需要进行跟踪以确保此类分配不会意外发送到替代品free

我相信 Chromium 和 Firefox 都取代了分配器,但它们玩了一些肮脏的把戏,并且可能不得不随着编译器、链接器和运行时的发展而更新它们的方法。