我有一个使用boost::thread
. 出于性能原因,我希望每个线程都有一个独立的堆。
我可以使用创建堆,HeapCreate()
但不清楚如何将其连接到 CRT 库,以便在创建new
的malloc
堆上分配内存。如何才能做到这一点?
我有一个使用boost::thread
. 出于性能原因,我希望每个线程都有一个独立的堆。
我可以使用创建堆,HeapCreate()
但不清楚如何将其连接到 CRT 库,以便在创建new
的malloc
堆上分配内存。如何才能做到这一点?
如何才能做到这一点?
如果不完全替换整个内存分配器,就无法完成。例如,可扩展内存管理器Hoard就是这样做的。但是替换内存分配器并不适合胆小的人。
如果您想使用 per-thread heap with HeapCreate
,并且您的分配/解除分配代码被合理地包含,那么您可以简单地在您的线程代码中显式调用HeapAlloc
和调用。HeapFree
但是,如果这与性能良好的标准 CRT 分配器一样快,我会感到惊讶。
不幸的是,没有安全且记录在案的方法来替换 CRT 堆。仅限黑客。
对于new
/delete
语句,您可以提供全局operator new()
,operator delete()
它将根据当前线程在所需的堆中分配/释放内存。线程本地存储(TLS)通常用于存储线程本地堆句柄。
对于malloc
/free
没有这样的记录方式来替换。大多数 hack 都在此处进行了描述。
您可以提供一个“全局运算符 new”,您可以使用它来检查您所在的线程并从适当的堆中返回内存。当然,您还需要提供自己的“全局删除”。
当然,这只会“捕获”实际使用 new 和 delete 的情况:-)
另一种方法:使用多个 DLL,除了名称之外,每个 DLL 都相同。每个线程加载不同的 DLL。