Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> malloc関数/フリーな実装

malloc関数/フリーな実装

  
        

のmalloc /無料の実装

チャンク

C標準ライブラリヒープ管理単位の基本的な割り当てでチャンク出て、チャンクは次のようにそのデータ構造があり、論理的な概念です。< BR>

構造体malloc_chunk {

size_tのprev_size;

size_tのサイズ;

構造体malloc_chunk * FD;

構造体malloc_chunk * BK;

構造体malloc_chunk * fd_nextsize;

構造体malloc_chunk * bk_nextsize;

};チャンクがフリー状態である場合
は、

は、FDとBKを構成しますリンクリスト、後で割り当てられるか、直接再配布した後、ここから大きな空きブロックにマージすることができるように、自由なユーザメモリとなっているレコードの1つのペア。チャンクがアロケーションされている場合、そのサイズ後から今回は、意味のあるユーザー・データではありません、それはなど、BK、FDと言うことです、これは、コメントから見ることは容易です。チャンクが出て割り当てられると
は、

、このチャンクに記録されているサイズは、実際に私たちはmalloc関数を呼び出して、レコードをprev_sizeパラメータ値が現在のチャンクに隣接している、つまり、ユーザプログラムのメモリサイズに割り当てられましたチャンクのサイズ。サイズ;それぞれチャンクアドレスの次に、アップ/ダウン現在のチャンクのchar * pのアドレスは、PP->. Prev_sizeおよびp + P->の場合は、この設計の理由はすぐに、隣接するチャンクの例をマージ/探しています次の2つの簡単なマクロの解析が明らかになる:

(1)ユーザのポインタを得(すなわち、ここでSIZE_SZはsizeof(size_t型))チャンクから

の#define chunk2mem(P)(( void_t *)((チャー*)(P)+ 2 * SIZE_SZ))


得られたチャンクの(2)アドレス

ユーザからの#define mem2chunk(MEM)((mchunkptrポインタ)(( CHAR *)(MEM) - メモリ、8バイトのチャンクであるユニットを割り当てるとき、下位3ビットがこのサイズに0である2 * SIZE_SZ))

は、他の目的に使用することができます。 glibcの2つの定義があります。

PREV_INUSEの0x1のを
の#define

の#define IS_MMAPPEDを0x2の

ここだっ割り当てられている場合(チャンクが使用されているかどうかに記録PREV_INUSE 1)、及びMMAP分布によって得られたかどうかをIS_MMAPPED現在のチャンクを識別する。以下のマクロはのチャンクの理解を深めることができます。

//次のチャンク

に#define next_chunk(P)の現在のチャンク(p)を取得します((mchunkptr)(((CHAR * )(P))+((P) - >サイズ&#038;〜PREV_INUSE)))

//チャンクの現在のチャンク(p)を取得

に#define prev_chunk(P )((mchunkptr)(((CHAR *)(P)) - ((P) - > prev_size)))

//は、現在のチャンク(P)が使用されているか否かをメモして決定:pがINUSEあります
にチャンクサイズに格納された次の隣接ビット情報

の#define INUSE(P)((((mchunkptr)(((CHAR *)(P))+((P) - >サイズ&#038; 〜PREV_INUSE))) - >サイズ)&#038; PREV_INUSE)は

//現在のチャンク(P)を使用するように配置され、隣接する次のチャンクサイズの、すなわち最下位ビットが1

の#define set_inuse(P)((mchunkptr)(((char型*)(P))+((P) - >サイズ&#038;〜PREV_INUSE))) - >サイズ

Copyright © Windowsの知識 All Rights Reserved