如何在OSX上获得tbbmalloc_proxy?

时间:2014-05-06 07:51:54

标签: c++ macos memory-management tbb

线程构建块包括libtbbmalloc(和scalable_allocator)形式的线程本地分配器。对于Linux和Windows,他们还提供libtbbmalloc_proxy,只需通过链接即可将mallocnew替换为可扩展版本。

官方文档在OSX上省略了libtbbmalloc_proxy的任何提及,它也没有出现在发行版的lib目录中。在OSX上获得可扩展new的规范方法是什么?

1 个答案:

答案 0 :(得分:1)

已更新:OS X的内存分配例程的全局替换已添加到英特尔线程构建模块v4.3中。您可以使用DYLD_INSERT_LIBRARIES环境变量在程序加载时加载libtbbmalloc_proxy.dylib,或者通过将主可执行文件与代理库链接来进行替换。见more details in the TBB User Guide。在4.3之前,OS X无法使用此功能。


替换new的规范方法是定义自己的版本。根据C ++标准,应在全局命名空间中定义<new>中声明的以下例程:

void* operator new(std::size_t size);
void* operator new(std::size_t size, const std::nothrow_t&) noexcept;
void operator delete(void* ptr) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
void* operator new[](std::size_t size);
void* operator new[](std::size_t size, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;

默认情况下,这些函数在语言支持库中定义(实现);但是允许程序重新定义这些功能。因此,您可以实现这些功能以使用TBB内存分配器,例如

void* operator new( std::size_t object_size )
{
    void* mem = scalable_malloc( object_size );
    if (mem==NULL) throw std::bad_alloc();
    return mem;
}
void* operator new(std::size_t object_size, const std::nothrow_t&) noexcept
{
    return scalable_malloc( object_size );
}

等等。

另见: