2

shared_ptr のオブジェクト プールを作成することはできますか? これを頭の中でスケッチすると、これを行う 2 つの方法がわかりますが、それぞれに欠点があります。

  1. T 個のオブジェクトが再利用可能なプールに格納されている場合、get() 要求で T を shared_ptr にラップすると、制御ブロックが毎回ヒープに再割り当てされることになり、オブジェクト プールの概念が壊れます。

  2. shared_ptr オブジェクトが再利用可能なプールに格納されている場合、shared_ptr オブジェクトは、カスタム デリーターを開始するために存在を停止する必要があり、カスタム デリーター関数は T ポインターでのみ呼び出されます。したがって、リサイクルするものは何もありません。

4

3 に答える 3

3

徹底的な調査とテストの結果、(C++11 以下の時点で) 再利用可能なのオブジェクト プールを直接作成する正当な方法はないと結論付けました。shared_ptr<T>確かTに、サービスを提供するオブジェクトのプールを非常に簡単に作成できますshared_ptr<T>が、その結果、制御ブロックのサービスごとにヒープが割り当てられます。

ただし、 のオブジェクト プールを間接的に作成すること可能です (これが私が見つけた唯一の方法です)。間接的に言うと、制御ブロックが破棄されたときに解放されたメモリを再利用するために格納するために、カスタムの「メモリ プール」スタイルのアロケータを実装する必要があるということです。このアロケータは、`shared_ptr' コンストラクタの 3 番目のパラメータとして使用されます。shared_ptr<T>shared_ptr<T>

template< class Y, class Deleter, class Alloc > 
   std::shared_ptr( Y* ptr, Deleter d, Alloc alloc );

shared_ptr<T>引き続きヒープ メモリで構築/割り当て、削除/割り当て解除されますが、それを止める方法はありませんが、カスタム アロケータを介してメモリを再利用可能にすることで、確定的なメモリ フットプリントを実現できます。

于 2015-07-22T09:23:10.887 に答える
1

はい、可能です。しかし、あなたのプールを元に戻すのではなく、元に戻すstd::shared_ptr<T>ことを検討しboost::intrusive_ptr<T>ます。あなたはintrusive_ptr_release()そのブロックをプールから解放する責任があるかもしれませTintrusive_ptr<T>.

于 2015-06-27T15:26:30.517 に答える