5

から派生したクラスの形式で C++ std 準拠のメモリ管理を使用したいのですがstd::allocator、メモリのチャンクを割り当てて、それらを小さな部分で解放および解放できます。boost::pool しか見つかりませんでしたが、これは上記の意味で std に準拠していません。もっと便利なものはありますか、それとも自分でコーディングする必要がありますか?

std::allocator(多くの小さなオブジェクトを割り当てる場合、つまり を使用する場合、 はしばしば役に立たないことに注意してくださいstd::list。)

編集して明確にします。

std::listたとえば、多くの小さなオブジェクトを使用したい場合、その実装をstd::allocator使用して各オブジェクトを割り当てる::newと、実行時にかなりのオーバーヘッドが発生します (メモリも同様です)。オブジェクトの大きなチャンクを割り当てて、1 つずつ配布する方がはるかに効率的です。このために、任意のライブラリ コンテナーで使用でき、必要なメモリ管理を提供し、理想的にはオブジェクトの数を伝えることができる、std準拠したアロケーター (から派生する必要はありませんがstd::allocator、同じ概念を実装する必要があります) が必要です。std個別に割り振れそうです。

4

1 に答える 1

1

GCC は、 の代替としていくつかの拡張アロケータstd::allocatorを提供します。

あなたの要件が何であるかを実際に述べていないので、それらのいずれかがあなたに適しているかどうかを言うことはできません.

OPの編集に続いて編集します。

std::listたとえば、多くの小さなオブジェクトを使用したい場合、その実装をstd::allocator使用して各オブジェクトを割り当てる::newと、実行時にかなりのオーバーヘッドが発生します (メモリも同様です)。

なぜメモリも?各std::listノードの追加ポインターのオーバーヘッドは、メモリがnewカスタム アロケーターからのものであるかどうかに関係なく存在します。すべての小さなすべてのコーティングを追跡するためにヒープによって行われる簿記を意味しているだけですか?

オブジェクトの大きなチャンクを割り当てて、それらを 1 つずつ配布する方がはるかに効率的です。

あなたはそれを測定しましたか?

多数の個別のノードを割り当てるオーバーヘッドが必要ない場合std::list、適切なコンテナーであると確信していますか? vectorまたははどうですかdeque

boost::stable_vectorは引き続きノードベースですが、ノードごとのメモリ オーバーヘッドは よりも少なくなりstd::listます。

Aboost::flat_map<int, T>はノードベースではなく、代わりに使用できますstd::list<T>

アロケーターはトリッキーであり、(実際の、または知覚された) 問題に対する最良の答えであるとは限りません。

于 2012-06-20T12:23:00.587 に答える