Kov*_*Bal 11 c++ malloc memory-management stl
如何使用带有jemalloc(或任何其他malloc
实现)的C++ STL容器?
它是否像包含一样简单jemalloc/jemalloc.h
?或者我应该为他们写一个分配器?
编辑:我正在处理的应用程序在其生命周期内分配和释放相对较小的对象.我想替换默认的分配器,因为基准测试显示应用程序不会超过2个核心.分析显示它正在等待内存分配,这就是导致扩展问题的原因.据我了解,jemalloc
将有助于此.
我希望看到一个解决方案,这是平台中立的,因为应用程序必须在Linux和Windows上运行.(在Linux下,链接不同的实现很容易,但据我所知,在Windows上很难实现.)
C++允许您替换 operator new
.如果这个替换operator new
调用je_malloc
,那么std::allocator
将间接调用je_malloc
,反过来所有标准容器都会.
这是迄今为止最简单的方法.编写自定义分配器需要编写整个类.更换malloc
可能还不够(不能保证未更换的operator new
电话malloc
),并且它具有Adrian McCarthy先前提到的风险
如果你想替换malloc
程序中的任何地方(我想要并且似乎也是唯一的逻辑解决方案),那么你所要做的就是链接它.
所以,如果你使用gcc
那么你所要做的就是:
g++ yourprogram.cpp -ljemalloc
Run Code Online (Sandbox Code Playgroud)
但是,如果它是不可能的,那么你就必须通过其他的功能如使用jemalloc je_malloc
和je_free
,然后你必须重载new
和delete
运营商.
如果您不使用特定于实现的功能(主要是统计信息),则不需要包含任何标头.
编写分配器将是最简单的解决方案,因为 stl 被设计为具有可互换的分配器。这将是最简单的路径。
一些项目玩游戏试图获得替代malloc
实现来替换编译器的配套库提供的malloc
and new
。这很容易出现各种问题,因为您最终会依赖编译器的特定实现细节及其通常使用的库。这条路充满了危险。
尝试malloc
全局替换的一些危险:
malloc
. 例如,一个实现new
可能会绕过malloc
大量分配并直接调用操作系统来分配内存。这需要进行跟踪以确保此类分配不会意外发送到替代品free
。我相信 Chromium 和 Firefox 都取代了分配器,但它们玩了一些肮脏的把戏,并且可能不得不随着编译器、链接器和运行时的发展而更新它们的方法。