この意味でのヒープは、プログラムが大量のデータを格納するために使用できるスタック上にないメモリ領域です。
ただし、プログラムの有効期間中、そのプログラムは自身のメモリ使用量を追跡する必要があります。具体的には、プログラムは気まぐれに仮想アドレス空間全体に書き込むことはできません。書き込み先のアドレスがオペレーティング システムによってマップされていない場合、アクセス違反が発生し、プログラムがセグメンテーション フォールトを受け取り、終了します。
したがって、実行中のプログラムは、オペレーティング システムにスペースを割り当てるように要求する必要があります。可能な場合、オペレーティング システムはこれを行い、その空間を仮想アドレス空間にマップします。
ただし、メモリの一部を解放する必要がある場合は、それがどこにあり、何をしているのかを知る必要があります。また、プログラムには特定のサイズのメモリを格納する場所が与えられているため、知っておく必要があります。ほら、物事はすぐに複雑になる - たとえば C から大量のメモリ割り当てを行ってから、頻繁に再び解放する場合、割り当てと解放の間の 1 対 1 のマップと同じ効果。代わりに、メモリ アロケータがオペレーティング システムから大量のメモリ チャンクを取得し、それを追跡した方がよいでしょう。
割り当てられたスペースのどの部分が現在使用されているか、および仮想アドレス空間のどの範囲が使用のためにマークアウトされているかを追跡するためのストレージ構造の必要性を入力します。
そう、
- Heap_Init はこの構造をセットアップし、おそらく、最新のアロケーターではメモリの一部を初期化します。
- Heap_Allocate はこの構造体を使用し、要求が与えられると空き領域へのポインタを返します。これには、プログラムが OS からより多くのスペースを要求する必要がある場合とそうでない場合があります。
- Heap_Free は構造体を使用して、以前に割り当てられたメモリを解放します。
これが、これらの関数が行うことの理論です。コードを見ると、特定の実装が何をしているかを理解できるはずです。