もう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_
などもこれらのオプションを設定します。
malloc
がmmap
で割り当てたメモリは、明らかにmunmap
で解放されます。私はGlibcのソースコードの外側に文書化されているかどうか、あるいは互換性の保証があるかどうかはわかりません。
戻ってみましょう。プロファイリングによって証明されたアプリケーションのメモリ割り当てはボトルネックですか?そうでない場合は、カスタムアロケータを気にする必要はありませんか? – lothar
階層的なメモリプールは、メモリリークの原因の1つを排除するので、正確性をも助けています。 – florin
@florin C++を正しく使うと(コンテナ、raii、...)、漏れの可能性は非常に低いです。私は最後のリークを追跡しなければならない時も覚えていない。それは何年も前です。 – lothar