2009-05-07 14 views
2

私のアプリケーションはほとんどのレイヤーに編成されていますので、APR memory poolsのようなものが最善の方法であることがわかりました。C++用の階層メモリアロケータライブラリ

SOについてC++ placement new投稿here & here、およびa more generic C allocation questionつのポストで提案されているように、私は手クラフト階層プールアロケータを考えていたが、純粋なNYIの伝統に私が最初にあれば、このような何かを求めているので読んでいる間もう存在している。

はまた、OSに未使用のメモリをお返しすることができるという素晴らしい特性を持つことができます(割り当てがmmap(MAP_ANON)で行うことができるので)またはFerrucicohereが提案されているようallocating from the stackである可能性があります。

+1

戻ってみましょう。プロファイリングによって証明されたアプリケーションのメモリ割り当てはボトルネックですか?そうでない場合は、カスタムアロケータを気にする必要はありませんか? – lothar

+0

階層的なメモリプールは、メモリリークの原因の1つを排除するので、正確性をも助けています。 – florin

+0

@florin C++を正しく使うと(コンテナ、raii、...)、漏れの可能性は非常に低いです。私は最後のリークを追跡しなければならない時も覚えていない。それは何年も前です。 – lothar

答えて

5

もう1つの良い階層型メモリアロケータがありますが、カバーの下にmallocが呼び出されています。

tallocは、デストラクタを備えた階層型プールベースのメモリアロケータです。これはSamba4で使用されるコアメモリアロケータであり、Samba4開発の多くの面で大きな違いをもたらしました。

tallocを使い始めるには、talloc guideを読むことをおすすめします。言われている、glibcでのmallocがすでにmallopt(M_MMAP_THRESHOLD, bytes)経由で設定することができますmmap_thresholdより大きなアロケーションのmmap(MAP_ANON)を、使用していること

。デフォルトでは、それは動的に調整されます

/* 
    MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically 
    adjusted MMAP_THRESHOLD. 
*/ 

#ifndef DEFAULT_MMAP_THRESHOLD_MIN 
#define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024) 
#endif 

#ifndef DEFAULT_MMAP_THRESHOLD_MAX 
    /* For 32-bit platforms we cannot increase the maximum mmap 
    threshold much because it is also the minimum value for the 
    maximum heap size and its alignment. Going above 512k (i.e., 1M 
    for new heaps) wastes too much address space. */ 
# if __WORDSIZE == 32 
# define DEFAULT_MMAP_THRESHOLD_MAX (512 * 1024) 
# else 
# define DEFAULT_MMAP_THRESHOLD_MAX (4 * 1024 * 1024 * sizeof(long)) 
# endif 
#endif 

既定では、#define DEFAULT_MMAP_MAX 65536個はmmapを使用して割り当てられます。これはmallopt(M_MMAP_MAX, count)で変更できますが、多くの場合、mmapを使用するとオーバーヘッドが発生します。

環境変数MALLOC_MMAP_THRESHOLD_などもこれらのオプションを設定します。

mallocmmapで割り当てたメモリは、明らかにmunmapで解放されます。私はGlibcのソースコードの外側に文書化されているかどうか、あるいは互換性の保証があるかどうかはわかりません。

+0

sizeof(talloc_chunk)は88バイト(2.0.8)です。階層構造の各リーフは、88バイトの重みを有する。これは大したことではありません – puchu

2

Dave HansonのC Interfaces and Implementationsには、注意深く調整された単一プールアロケータがあります。それらをリンクして階層的なアロケータを作成することができます。これは、自分自身を最初から起動するより簡単です。

doには、メモリ管理が重要なボトルネックであることを示すプロファイリング結果があります。または、割り当てのためにAPIを単純化しようとしていますか?

+0

あなたの次の推測は正しいです、私は匿名のmmapsを手作業よりも優れたAPIを持っているようにしようとしています。 –

+0

OK、その場合、私はHansonのAPIがかなり好きです---チェックアウトする価値があります。 –