0

C++ テンプレートを使用してメモリ プール クラスを実装していますが、ブロックの適切なサイズを知りたいと思っています。例えば:

template <typename T>
class Mempool {

  unsigned char* block;

  // constructor. 
  Mempool() {
    block = malloc(sizeof(T)*DEFAULT_N)
  }

};

上記の例では、ブロック サイズは実際には型Tと、作成される要素数の既定値によって異なります。これを行うためのベスト(または一般的な)プラクティスは何ですか? ここでブロックサイズのメモリアライメントを考慮する必要がありますか?

4

1 に答える 1

0

多くは実際のユースケースに依存するため、一般的なアドバイスしかできません。

配置: プール内のオブジェクトが正しく配置されていることを確認する必要があると思います。つまり、少なくともstd::alignment_of<T>::valueまたはの倍数であるメモリ位置にオブジェクトを配置したい場合がありますalignof(T)

キャッシュの使いやすさ : プールは、オブジェクトの場所をキャッシュ ライン サイズの倍数に切り上げる場合もあるため、(小さい) オブジェクトは 2 つのキャッシュ ラインにまたがって配置されることはなく、常に 1 つのキャッシュ ラインに配置されます。

パディング: オブジェクトが非常に小さい (ほんの数バイト) のに非常に多くのオブジェクトがある場合、追加のパディングによりメモリ要件が大幅に増加する可能性があり、これが問題になるかどうかはアプリケーションによって異なります。オブジェクトが近接した場所に保持されておらず、多くのキャッシュ ミスがある場合、パディングが多すぎると、実際にはパフォーマンスが低下する可能性があります。

基礎となるメモリ管理: そして最後に、適切なブロック サイズは、基礎となるストレージにも依存する場合があります。割り当てサイズを OS ページ サイズと一致させたい場合や、その倍数を使用したい場合があります。さらに、mallocが高価な場合は、syscall のオーバーヘッドと競合を避けるために、呼び出し回数をできるだけ少なくしたいでしょう。より安価な環境でmallocは、初期ブロック サイズを小さくしてmallocより頻繁に使用しても問題ない場合がありますmallocが、それでも多少のオーバーヘッドは発生します。これの大部分は OS 固有です。

そのため、どのような初期サイズを選択しても、いくつかの典型的なワークロードのメモリ使用量と割り当てパフォーマンスを測定する必要があります。これにより、純粋な推測よりも知識に基づいた見積もりを行うことができます。

最後に、 tcmallocjemallocなど、すぐに使用できる malloc 置換があります。これらは、OS のものとはまったく異なる特性を持つ場合がありますmalloc。したがって、独自のアロケーターをロールする代わりに、これらのいずれかをチェックすることをお勧めします。

于 2015-12-17T20:36:12.473 に答える