0

我在我的程序中使用了 boost::object_pool,但是我发现了一些问题,它无法退出。下面是代码。不要建议我使用 boost::pool。boost::pool 没问题,只讨论 boost::object_pool。有人可以帮助我吗?

#include <iostream>
#include <boost/pool/object_pool.hpp>

int main(void) {
    boost::object_pool<int> p;
    int count = 1000*1000;
    int** pv = new int*[count];

    for (int i = 0; i < count; i++)
            pv[i] = p.construct();
    for (int i = 0; i < count; i++)
            p.destroy(pv[i]);

    delete [] pv; 

    return 0;
}

该程序无法正常退出。为什么?

4

3 回答 3

1

在我的机器上,这个程序可以正常运行,虽然速度很慢。

调用“destroy”的循环非常慢;它似乎有一个 O(N^2) 位;至少,循环大小每增加 10 倍,运行时间就会增加 90 倍。

以下是一些时间安排:

1000 elements        0.021 sec
10000 elements       1.219 sec
100000 elements      103.29 secs  (1m43.29s)
1000000 elements     13437 secs   (223m57s)
于 2012-05-08T18:44:28.650 回答
0

也有人打败了我——刚刚通过 boost 邮件列表看到了这个问题。

根据文档,destroy is O(N) 所以肯定调用这个 N 次对于大 N 来说并不理想 - 但是我想使用 Object Pool 析构函数本身(它为每个分配的对象调用析构函数)本身就是 O(N )对批量删除有很大帮助)。

我确实有一张图表显示我的机器上的时间 - 但由于我没有使用 Stack Overflow,所以我不能发布它 - 嗯,它没有显示那么多......

于 2012-05-08T21:07:26.423 回答
0

我已经发布了一个从 boost 沙箱中的合并排序派生的修复程序:

https://github.com/graehl/boost/tree/object_pool-constant-time-free

或者,独立:

https://github.com/graehl/Pool-object_pool

于 2013-06-10T00:42:06.120 回答