2

私はこの質問を見ましたが、それはそれを行う方法を説明するのではなく、単に私がやりたいことを示しています。

C動的メモリ割り当てをサポートするシステムとサポートしないシステムで実行されるライブラリがあります。mallocヒープが使用できないときに静的配列からメモリを割り当てる独自の関数を作成して、システム間の移行を簡単にしたい。

私は自分の問題に対する完全に具体化された解決策を探していませんが、例を含むブログ投稿が役に立ちます。いつ、いつ使用しないかを決めるのmallocは簡単です。しかし、静的配列からメモリを割り当てる方法を理解するのに少し時間がかかります。

static char my_memory[10000] = { 0 };

static void *my_malloc(size_t size) {
    // Here, I want to allocate 'size' in 'my_memory'.
    return NULL;
}

static void *my_free(void* memory) {
    // Here, I want to free 'memory' from 'my_memory'.
}

編集:
私のニーズはここでは非常に単純であり、この方法で割り当てられるメモリはほとんどありません(そしてほとんど解放されません)。SteveJessopのシンプルなソリューションがぴったりです。

4

3 に答える 3

2

書くことができる最も単純なアロケーターについて:

  • 初期化: current_position = my_memory + sizeof(my_memory). 実装の配置要件によっては、current_positionが正しく配置されていることを確認する必要がある場合があります。
  • 割り当て: return ((current_position - my_memory) <= size) ? 0 : (current_position -= size);。整列のためsizeに、最初にある数の倍数に切り上げなければならない場合があります。
  • 無料: 何もしません。

それでおしまい。明らかにfree、多くの呼び出しを行うと、この戦略はすぐにメモリ不足になります。したがって、複雑さを導入できます。

  • 割り当て:size配列から切り出すすべての「ブロック」の先頭に割り当てのサイズを書き込むのに十分なスペースを増やします。size レコードの末尾 (つまり、使用可能なメモリの先頭) へのポインターを返します。また、すべての割り当てが、定義したヘッダー構造体を含めるのに十分な大きさであることを確認してください。リクエストがそれよりも小さい場合でも同様です。

割り当てごとのオーバーヘッドを導入しましたが、これにより次のことが可能になります。

  • free: ヘッダー構造体を使用して、解放されたブロックをある種のデータ構造に追加します (引き続きサイズを覚えておいてください)。

  • 割り当て: 要求を満たすことができる割り当てがデータ構造にある場合はそれを返します。そうでない場合は、メイン配列から別のスライスを切り取ってそれを返します。

これで、ワーキング メモリ アロケータができました。これは特にうまく機能しません。最新技術から約 60 年遅れているため、おそらくさらに複雑な処理を導入する必要があります。しかし、メモリ割り当てアルゴリズムの全歴史は、1 つの答えの範囲を超えています。ここから、アロケーターが目的に十分対応できるか、あきらめて既存のライブラリーを使用することにするかのいずれかになるまで、先に進むことができます。

于 2012-12-04T17:11:18.460 に答える
1

各割り当ての開始時に次の空きブロックへのアドレス (この場合は配列内のオフセット) を保持できます。つまり、配列の一部を空きブロックのリストとして使用します。これは、メモリ ブロックの割り当て方法と検索方法を考慮したものです。free は、配列内の空きオフセットを調整するだけでなく、複数の空きブロックを合体させる必要があるメモリを返すときに、よりトリッキーです。そうしないと、メモリの断片化が発生し、必要なサイズのチャンクを割り当てることができなくなります。

重要な概念は、割り当てられたブロックには次の空きブロックへのオフセットも常に含まれているということだと思います。これは、独自の配列を使用して、割り当てられたものを追跡する方法です。

于 2012-12-04T17:10:47.883 に答える
1

古いものですが良いもの (問題を説明するブログ投稿): http://g.oswego.edu/dl/html/malloc.html

または、パッケージ化されたものを探している場合: http://hempeldesigngroup.com/embedded/stories/memorymanager/

于 2012-12-04T17:12:33.800 に答える