2016-03-27 6 views

答えて

0

このalloc実装

を返します。つまり、使用するバイト数でallocを呼び出し、バッファへのポインタを取得するか、バッファが使用できない場合は0を取得します。それを解いてみましょう。

static char allocbuf[ALLOCSIZE]; 
static char *allocp = allocbuf; 

allocbufは、データを保持する実際のバッファです。これを処理するために、ポインタのallocpを使用しています。これはバッファの先頭を指しています。

char *alloc(int n) 
{ 
    if(allocbuf + ALLOCSIZE - allocp >= n) 

バッファを要求するとき、すでに使用されているバッファ部分が要求を満たすのに十分なスペースを残しているかどうかを確認します。このポインタのために、算術演算が使用されます:バッファの末尾を計算し(allocbufおよびALLOCSIZEを追加して)、未使用バッファの先頭を減算します(allocp)。これにより、バッファに残っているバイト数が得られます。次に、要求されたバイト数が少ないかどうかを簡単に確認できます。

{ 
     allocp += n; 
     return allocp - n; 
    } 
    else 
     return 0; 
} 

バッファが十分にある場合は、インクリメントをallocpとします。これで、ちょうど割り当てられたバッファ部分の後の最初のバイトが指し示されます。次に、呼び出し側が使用できるように、ちょうど割り当てたバッファ部分の先頭へのポインタを返します。呼び出し元にはmallocと似ています。バッファを要求し、ポインタを取得するか、NULLを取得します。有効なポインタを取得したら、それを使用することができます。

これにより、発信者はallocを複数回呼び出すことができ、利用可能なスペースがある限り、そのたびに新しいポイントのバッファが取得されます。動的メモリ

使用して簡単に言えば、あなたがデータを処理する必要がなく、コンパイル時にサイズを知らないとき、ダイナミックメモリが使用されています。

たとえば、ファイルからデータを読み取っている場合は、コンパイル時に指定したサイズの静的バッファを使用できますが、それより大きなファイルは読み取れません(または、読み込み専用の処理を追加する必要があります)。チャンク内のファイルですが、アプリケーションによっては動作しない可能性があります)。

ここで、メモリを動的に割り当てると、コンパイル時に設定したサイズに制限されません。その後、任意のサイズのファイルを読み込むことができます(唯一のコンピュータ上の使用可能なメモリによって制限されます。)

malloc対(これは)違いのカップルがありますalloc

、私はここで重要なものに焦点を当てますが。

最初に、データが配置される場所が異なります。変数はスタックに配置され、グローバルデータはbssまたはデータ(データが初期化されているかどうかによって異なる)に配置されます(システムおよびコンパイラによって多少異なる名前が付けられます)。動的メモリは、ヒープと呼ばれるセクションを使用します。

このalloc実装では、静的に割り当てられたバッファが使用されるため、データはbssセクションに配置されます。代わりにmallocがヒープを使用します。

第2に、この実装はmallocよりも制限されています。 mallocと一緒に、バッファを再び解放できるfreeがあります。 allocは、静的なバッファサイズを使用しているためまた、そのサイズによって制限されています - mallocコンピュータによって制限されている

あなたは限られた上allocのような実装を使用します(使用可能なメモリ、方法は、オペレーティング・システムは、メモリなどを扱います)システム:もしあなたがヒープを持っていなければ、バッファをもう一度解放する必要はありません。これらは、通常、マイクロコントローラでの制約です。 PCでは、独自の実装を使用しないでください。単純にmallocを使用してください。

+0

私はそのアプリケーションの例を得ることができますか? –

1

この関数は、mallocと同様の単純なメモリ割り当てインタフェースを実装します。メモリは、allocbufという固定サイズのアレイから割り当てられます。ポインタallocpは、配列内の次の空きバイトを指します。呼び出されると、要求を満たすのに十分な余裕があるかどうかがチェックされます。割り当てられたメモリの量はallocp - allocbufです。これを合計メモリ量(ALLOCSIZE)から差し引くと、残りの量が得られます。したがって、はちょうどALLOCSIZE - allocp + allocbuf、またはallocbuf + ALLOCSIZE - allocpです。私にとってそれは最も直観的な方法ですが、バッファの終わりからバッファ内の最初の空きアドレスを差し引いたものと考えることもできます。

いずれにしても、十分な空きがある場合は、nを追加してallocpを調整し、元の値であるallocpを新しく割り当てられたメモリのアドレスとして返します。そうでなければそれは静的バッファに基づいmalloc様機能を実現する(しかし配っバッファが追跡されていないので、割り当てられたバッファをfreeすることはできません)0

関連する問題