1

以前にこの用語を聞いたことがあるので、設計とコーディングの方法を知りたいです。
可能な場合、STL アロケーターを使用する必要がありますか?
OS のないデバイスでどのように実行できますか?
それを使用することと、malloc/new を実装した通常のコンパイラを使用することのトレードオフは何ですか?

4

2 に答える 2

3

独自のメモリ アロケータを作成する前に、非断片化メモリ アロケータが必要であることを知っておくことをお勧めします。通常、std ライブラリによって提供されるもので十分です。

必要な場合、断片化を減らす一般的な考え方は、OS にヒープ メモリを散発的に、ヒープ内の非常にさまざまな場所に提供し、他の多くのメモリが点在するように要求するのではなく、大きなメモリ ブロックを一度に取得してプールから割り当てることです。さまざまなサイズのオブジェクト。特殊なメモリ アロケータの作成者は、プールから割り当てられるオブジェクトのサイズとそれらの割り当てがどのように発生するかについてより多くの知識を持っているため、アロケータは、STL によって提供されるような汎用アロケータよりも効率的にメモリを使用できます。

メモリの断片化を減らしながら、競合を減らすスレッド固有のヒープを提供することでパフォーマンスを向上させることができるHoardなどのメモリ アロケータを見ることができます。これは、特にマルチコア プラットフォームで、アプリケーションをより直線的にスケーリングするのに役立ちます。

マルチスレッド アロケータの詳細については、こちらを参照してください。

于 2010-10-13T12:20:01.653 に答える
2

本質的にメモリ プールとは何かを説明しようとします - 実装してからしばらく経ちましたが、頭のてっぺんからこれをタイプしているだけです。:)

1. 断片化を減らすには、割り当てるオブジェクトのタイプに固有のメモリ プールを作成する必要があります。基本的に、各割り当てのサイズを、関心のあるオブジェクトのサイズに制限します。動的に割り当てられたブロックのリストを持つテンプレート化されたクラスを実装できます (リストの理由は、スペースの量を増やすことができるためです)。利用可能)。動的に割り当てられた各ブロックは、基本的に T の配列になります。

次に、ヘッドが次に使用可能なブロックを指す、単独でリンクされたリストである「フリー」リストを作成します。割り当ては、単にヘッドを返します。リンクされたリストをブロック自体に重ねることができます。つまり、各「ブロック」(T のアラインされたサイズを表します) は、基本的に T とリンクされたリスト内のノードの結合であり、割り当てられると T になり、解放されると、リスト内のノード。!!明らかな危険があります!! または、ブロック内のアドレスの配列を保持するために、別の (および保護されたブロックで、オーバーヘッドが追加されます) を割り当てることもできます。

割り当ては簡単で、ブロックのリストを反復処理し、最初に使用可能なものから割り当てます。解放も簡単です。追加のチェックは、これが割り当てられたブロックを見つけてから、ヘッド ポインターを更新することです。(注:placement new を使用するか、T の演算子 new/delete をオーバーライドする必要があります。これにはいくつかの方法があります。Google はあなたの友達です)

私が信じている「静的」は、タイプ T のすべてのオブジェクトのシングルトン メモリ プールを意味します。欠点は、T ごとに個別のメモリ プールが必要なことです。あなたは賢く、異なるサイズのプールを管理する単一のオブジェクトを持つことができます(たとえば、インデックスがオブジェクトのサイズであるプールオブジェクトへのポインターの配列を使用します)。

前の段落の全体的なポイントは、これがどれほど複雑であるかを正確に概説することです.RCが上で述べたように、それを行う前にそれが必要であることを確認してください-必要以上の苦痛をもたらす可能性があるため!

2. STL アロケータがニーズを満たしている場合は、それを使用してください。これは、自分が何をしているかを知っている非常に賢い人々によって設計されています。もっと早く。

3. なんらかの方法でメモリを割り当てられる必要があります (ハードウェア サポートまたは何らかの HAL など)。

4. 通常の malloc/new は、内部でさらに多くのことを行います (Google はあなたの友達です。私の答えはすでにエッセイです!) 上で説明した単純なアロケーターは再入可能ではありません。少しカバーを提供するためにミューテックスを使用しても、単純なアロケーターが通常の malloc/free よりも桁違いに高速に実行される危険があります。

しかし、最適化のこの段階にいる場合は、アルゴリズムとデータ構造の使用を最適化する可能性を使い果たしたのではないでしょうか?

于 2010-10-13T12:54:24.520 に答える