質問

アプリケーションの大部分はレイヤーで構成されているため、 APRメモリプールが最善の方法です。

SOで C ++の新しい配置の投稿について読む間、こちら& こちら、およびより一般的なC割り当ての質問提案されたように、階層プールアロケーターを手作りすることを考えていましたある投稿ではありますが、純粋なNYIの伝統では最初にこのようなものがすでに存在するかどうかを尋ねています。

また、未使用のメモリをOSに返すことができるという優れた特性を持つことができます( mmap(MAP_ANON)を使用して割り当てることができるため)または提案されたスタックからの割り当て Ferrucico こちら

役に立ちましたか?

解決

別の優れた階層メモリアロケーターを知っていますが、カバーの下で malloc を呼び出します。

  

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

     

tallocの使用を開始するには、 tallocガイドを読むことをお勧めします。

とはいえ、Glibcの malloc は、 mmap_threshold よりも大きい割り当てに mmap(MAP_ANON)をすでに使用しています。 mallopt(M_MMAP_THRESHOLD、bytes)。デフォルトでは、動的に調整されます

/*
  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

下げる場合は注意してください。デフォルトでは、 mmap を使用して #define DEFAULT_MMAP_MAX 65536 個以下のピースが割り当てられます。これは mallopt(M_MMAP_MAX、count)で変更できますが、多くの mmap を使用するとオーバーヘッドが発生します。

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

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

他のヒント

Dave Hansonの Cインターフェースと実装には、慎重に調整されたシングルプールアロケーターがあります。 。それらを一緒にリンクして、階層アロケーターを作成することができます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top