我在 C++ 中有一个使用场景,我多次调用的函数会创建一些本地的、小但动态大小的向量。在分析我的程序后,我注意到在 std::vector::free() 中花费了过多的时间。这种问题的自然(C++ 式)解决方案似乎是将默认分配器切换到更适合我的使用场景的东西。特别是,在这里使用内存池策略似乎很有意义。然而,到目前为止, boost::pool_alloc 一直是个麻烦。我已经让它工作了,但是虽然在我的小但经常调用的函数(我们将调用该函数 f())中分配更快,但它会导致调用 f() 的函数在返回之前挂起非常很久了。
然而更多的分析表明,所有的时间(在我厌倦等待之前的几十分钟)都花在了 pool_allocator::ordered_free() 上。我在一个简单的测试程序中重现了同样的行为(虽然不是那么极端),而且看起来,事实上,当大量构造的向量将它们的内存返回到单例池时,函数在返回之前会挂起很长时间.
如果有人知道避免这种行为的方法,或者知道另一个不会遇到这种问题的 C++ 池分配器,我将非常感激!