14

mallocC/C++ 用の/のさまざまな洗練された実装がたくさんありますがfree、固定サイズのバッファーで動作し、realloc. スレッドセーフなどは必要なく、私のオブジェクトは小さく、サイズもあまり変わりません。推奨できる実装はありますか?

編集

この実装を受信側の通信バッファーに使用して、可変サイズ (受信側には不明) のオブジェクトを転送します。割り当てられたオブジェクトは長くは存続しませんが、同時に複数のオブジェクトが使用される可能性があります。

誰もが標準の malloc を推奨しているようなので、質問を再構成する必要があるかもしれません。私が必要としているのは、自分のニーズに合わせて最適化を開始できるバッファー上での malloc の「最も単純な」実装です。最適化されたmallocを探しているのではなく、単純なものだけを探しているため、おそらく元の質問は不明でした。glibc-malloc から始めて拡張したくはありませんが、軽量のものを使用します。

4

7 に答える 7

27

Kerninghan と Ritchie は、C の本で小さな malloc / free を提供しているようです - それはまさに私が探していたものです(reimplementation found here)。単純な再割り当てのみを追加します。

これと同じくらい単純で簡潔な他の実装 (たとえば、二重リンク リストの使用) の提案については、引き続き喜んでいます。

于 2010-09-20T16:02:46.220 に答える
17

コンパイラにバンドルされている標準ライブラリに付属しているものをお勧めします。

また、malloc/free を再定義する合法的な方法がないことに注意する必要があります。

于 2010-09-20T14:54:29.697 に答える
4

コンパイラに付属するmalloc/ free/reallocは、プラグインするいくつかの関数よりもほぼ確実に優れています。

固定サイズのオブジェクトを改善することは可能ですが、通常は を置き換えようとするのではなく、メモリ プールmallocで補足する必要があります。通常、適切なサイズの個別のブロックに分割し、それらのブロックを管理できる大きなメモリ チャンクを取得するために使用します。malloc

于 2010-09-20T15:08:41.237 に答える
3

あなたはメモリプールを探しているように思えます。Apache ランタイム ライブラリにはかなり優れたライブラリがあり、クロスプラットフォームでもあります。

完全に軽量ではないかもしれませんが、ソースは公開されており、変更できます。

于 2010-09-20T15:34:05.793 に答える
3

CCANには比較的単純なメモリ プールの実装があります。

http://ccodearchive.net/info/antithread/alloc.html

これはあなたの法案に合っているようです。確かに、alloc.cは 1230 行ですが、そのかなりの部分がテスト コードとリスト操作です。実装したコードよりも少し複雑ですが、適切なメモリ割り当ては複雑です。

于 2010-09-20T17:35:09.057 に答える
2

私のメモリ使用パターンがmalloc/etcでサポートされていない限り、通常、割り当て機能を使用して車輪の再発明を行うことはありません。または、メモリを1つ以上の事前に割り当てられたゾーンに分割できます。各ゾーンには1つまたは2つのLIFOヒープが含まれます(オブジェクトを解放すると、その後に割り当てられた同じヒープ内のすべてのオブジェクトが解放されます)。後者のシナリオの一般的なバージョンでは、何かが解放されるときだけ、すべてが解放されます。このような場合、malloc()は次のように書き直すと便利です。

char * malloc_ptr;
void * malloc(int size)
{{
  void * ret;
  ret =(void *)malloc_ptr;
  malloc_ptr+=サイズ;
  retを返します。
}

割り当てられたオブジェクトごとにゼロバイトのオーバーヘッド。malloc()が不十分なシナリオにカスタム・メモリー・マネージャーが使用されたシナリオの例は、可変長のテスト・レコードが可変長の結果レコード(より長くまたはより短くなる可能性がある)を生成するアプリケーションでした。アプリケーションは、結果のフェッチとバッチの途中でのテストの追加をサポートする必要がありました。テストはバッファの下部から始まる増加するアドレスに保存され、結果は上部から始まる減少するアドレスに保存されました。バックグラウンドタスクとして、現在のテストの後のテストがバッファーの先頭にコピーされます(処理用のテストの読み取りに使用されたポインターは1つだけだったため、コピーロジックは必要に応じてそのポインターを更新します)。アプリケーションがmalloc/freeを使用していた場合、それは '

于 2010-09-20T16:52:19.917 に答える
1

最初に測定し、パフォーマンスが悪い場合にのみ専門化するというエコーのアドバイス - 置換が簡単になるように、malloc/free/reallocs を簡単に抽象化できるはずです。

特殊なプラットフォームを考えると、ランタイムの有効性についてはコメントできません。あなた自身のオブジェクトプーリング(他の回答を参照)またはLokiの小さなオブジェクト割り当てを調査するか、これは一見の価値があります。2 番目のリンクには、この問題に関する興味深い解説もあります。

于 2010-09-20T15:21:28.823 に答える