この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
を使用してください。
私はそのアプリケーションの例を得ることができますか? –