gpt4 book ai didi

c++ - 如何在 OSX 上获取 tbbmalloc_proxy?

转载 作者:行者123 更新时间:2023-11-28 06:53:14 27 4
gpt4 key购买 nike

Threading Building Blocks 包括 libtbbmalloc(和 scalable_allocator)形式的线程局部分配器。对于 Linux 和 Windows,他们还提供了一个 libtbbmalloc_proxy,只需链接到它就可以用可扩展的版本替换 mallocnew

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

最佳答案

更新:在 Intel Threading Building Blocks v4.3 中添加了 OS X 内存分配例程的全局替换。您可以通过加载 libtbbmalloc_proxy.dylib 来进行替换。在程序加载时使用 DYLD_INSERT_LIBRARIES 环境变量,或通过将主可执行文件与代理库链接。参见 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 );
}

等等

另见:

关于c++ - 如何在 OSX 上获取 tbbmalloc_proxy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23488942/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com