【发布时间】:2013-02-11 13:12:05
【问题描述】:
我在 C++ 中有一个使用场景,我多次调用的函数会创建一些本地的、小但动态大小的向量。在分析我的程序后,我注意到在 std::vector::free() 中花费了过多的时间。对此类问题的自然(C++ 式)解决方案似乎是将默认分配器切换为更适合我的使用场景的东西。特别是,在这里使用内存池策略似乎很有意义。然而,到目前为止, boost::pool_alloc 一直是个麻烦。我已经让它工作了,但是虽然在我的小但经常调用的函数(我们将调用该函数 f())中分配更快,但它会导致调用 f() 的函数在返回之前挂起 很长时间。
然而更多的分析表明,所有的时间(在我厌倦等待之前的几十分钟)都花在了 pool_allocator::ordered_free() 上。我在一个简单的测试程序中重现了同样的行为(虽然不是那么极端),而且看起来,事实上,当大量构造的向量将它们的内存返回到单例池时,函数在返回之前会挂起很长时间.
如果有人知道避免这种行为的方法,或者知道另一个不会遇到这种问题的 C++ 池分配器,我将非常感激!
【问题讨论】:
-
reserve-ing 正确确实可以提供帮助(如果您还没有)。 -
嗨,贾斯汀,是的,我已经在保留向量了。问题是我在函数调用时知道每个向量的大小(即它们没有增长),但在编译时不知道,所以它们仍然是动态的。
标签: c++ boost stl malloc allocator