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

誰かが私を打ち負かしました-ブーストメーリングリストでこの質問を見ました.

docs destroy is O(N) によると、これを N 回呼び出すことは大きな N にとって理想的ではありませんが、オブジェクト プール デストラクタ自体 (割り当てられたオブジェクトごとにデストラクタを呼び出す) を使用すると想像できます)一括削除に大いに役立ちます)。

私のマシンのタイミングを示すグラフはありましたが、スタックオーバーフローをあまり使用していないため、投稿できません-まあ、それほど多くは表示されません...

于 2012-05-08T21:07:26.423 に答える
0

ブーストサンドボックスのマージソートから派生した修正を公開しました:

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

または、スタンドアロン:

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

于 2013-06-10T00:42:06.120 に答える