2011-01-09 3 views
15

特に、C++でカスタムメモリアロケータをプロジェクトで使用している人について聞いたことがあります。C++:メモリアロケータ

  • malloc関数と比較して、カスタムメモリアロケータは何ですか?

  • mallocは最低レベルではありませんか?

+1

@muntoo:すべてのアロケータを言及していません。 – jalf

+0

@ jalf私はまだ読む方法を学んでいます。 –

答えて

18

メモリアロケータは、mallocより低いレベルありません。 (デフォルトのアロケータは通常、直接的または間接的にmallocを呼び出します)

アロケータでは、異なる割り当て方法を指定することができます。たとえば、大きなプールのメモリを取得するためにmallocを1回呼び出すアロケータを使用し、その後の割り当て要求では、このプールの小さなチャンクを返します。

また、メモリが割り当てられたり解放されるたびに、追加のタスクを実行できるようにフックとして使用できます。

mallocは、移植性を失うことなく行くことができる最低のものです。 mallocは、通常、OS固有のメモリ割り当て機能を使用して実装されているため、低レベルのままです。しかし、あなたの主な質問とは無関係です。なぜなら、C++のアロケータはより高いレベルの抽象であるからです。

+1

+ 1-多くの割り当て戦略がありますが、mallocはできるだけ一般的に実行可能なものであることを意図したものです。 – Puppy

5

カスタムメモリアロケータは、デフォルト以外の何らかの方法でバイトブロックを取得するmalloc(実際には、通常はoperator newの代替)の代わりです。 mallocは、最小限のレベルではありません。malloc自体は、パーティション化のためのメモリブロックを割り当てるOSのより単純なプリミティブとして実装されているためです。カスタムアロケータを作るための

一般的な使用例は、ロギングを割り当て、(互いに近いオブジェクトを割り当てることによって)良い局所性を保証した方法で割り当て、(デフォルトのアロケータは、この時に通常本当に悪いです)小さなオブジェクトの割り当てのために最適化されています/ tracking(リークを診断するため)、ガーベジコレクションされたリソースプールからの割り当てなどがあります。利用できるさまざまなオプションがあります。多くのプログラムでは、これらのカスタムアロケータを使用してパフォーマンスを少し絞り込むことができます。

1

malloc()は、実際にプロセスにさらに多くのメモリを割り当てる必要があるときにsbrk()をシステムコールするlibc(またはglibc)のライブラリ関数です。 malloc()、calloc()などが呼び出されたときに使用されるメモリブロックのリストをmalloc()およびfree()が管理します。

malloc()の動作が望ましくない場合、またはmalloc/freeの上で追加の作業を行いたい場合は、カスタムアロケータを使用できます。

+1

'malloc'はWindowsでは' sbrk() 'を呼び出しません。 ;)これはあなたのOSの実装の詳細なものであり、 'malloc'自体とは関係ありません。 – jalf

+0

True :)プラットフォームバイアス... –

16

カスタムアロケータの詳細な説明は、以下の論文(私が共同作ったもの)にあります。 C++プロジェクトでカスタムアロケータを使用する前に、このペーパーを読んでください。エグゼクティブオーバービューはです。領域を除くカスタムアロケータのすべてのスタイルよりも優れた汎用アロケータが優れています(より高速でスペース効率が良い)が、深刻な問題がある

再考カスタムメモリ割り当てACM linkdirect PDF linkPowerpoint talk slides)、OOPSLA 2002。 パフォーマンスの向上を実現することを期待して

プログラマは、多くの場合、 カスタムメモリアロケータを使用します。この の詳細な調査では、 アロケータを使用する8つの アプリケーションを調べています。驚いたことに、これらのアプリケーションのうち、 のうちの6つに対して、最先端の 汎用アロケータ(Lea アロケータ)が、カスタムアロケータよりも良好に実行されるか、 より優れています。 の2つの例外は領域を使用し、 はより高いパフォーマンスを提供します (最大44%の改善)。領域 もプログラマ負担を軽減し、 はメモリリークの原因を取り除きます。 しかし、領域内で プログラマが個々のオブジェクトを解放することができないことが、 のメモリ内で の実質的な増加につながる可能性があることを示しています。さらに悪いことに、この制限は そのusefulness.We我々は 収獲を呼び出す汎用及び 領域ベースアロケータの 一般に存在する還元、 一般的なプログラミングイディオムのための領域の使用を妨げます。リープは、 領域とヒープの組み合わせであり、 個別オブジェクト の削除を追加して完全な の領域セマンティクスを提供します。私たちの リープの実装は高い のパフォーマンスを提供し、他の アロケータよりも領域のようなセマンティクスを上回っていることを示しています。 次に、スペースの利点を実証するためのケーススタディ と、実際にはリープ のソフトウェア工学的メリット を使用します。我々の結果は、 の高速領域を必要とするプログラマ はリープを使用すべきであり、カスタム アロケータを考えているプログラマはほとんどがLea アロケータを使用するべきであることを示しています。

2

メモリアロケータは、速度の最適化として使用されます。 オペレーティングシステムによる割り当てが遅い。自分のメモリマネージャーが大量のメモリを持ち、OSを経由せずにそのメモリバケットから割り当てを行います。この手法は、ゲーム/コンソール/埋め込みシステムでより頻繁に使用されます。

http://www.memorymanagement.org/articles/

http://www.ibm.com/developerworks/aix/tutorials/au-memorymanager/au-memorymanager-pdf.pdf

関連する問題