ヒープの作成

固定サイズ・ヒープ、または動的サイズ変更ヒープ (dynamically-sized heap) を作成できます。固定サイズ・ヒープを使用するとき、メモリーの初期ブロックは、 この初期ブロックに対して行われるすべての割り当て要求を満たすのに十分な大きさが必要です。 動的サイズ変更ヒープ (dynamically-sized heap) により、プログラムの要求に応じて、ヒープを拡張および縮小することが可能です。

固定サイズ・ヒープの作成

固定サイズ・ヒープを作成する時は、そのヒープおよびヒープの管理に必要な内部情報を保持して、 それにハンドルを割り当てるために十分な大きさのメモリーのブロックをあらかじめ割り当てておく必要があります。 次に例を示します。
Heap_t fixedHeap;    /* this is the "heap handle" */
/* get memory for internal info plus 5000 bytes for the heap */
static char block[_HEAP_MIN_SIZE + 5000];  
内部情報には、_HEAP_MIN_SIZE マクロ (umalloc.h に定義されている) で指定されている最小のバイト・セットが必要です。 必要なブロックのサイズを判別するには、 プログラムで必要とされるメモリー量をこの値に加算してください。 ブロックが完全に割り振られると、ヒープに対するそれ以上の割り振り要求は失敗します。

メモリーのブロックを割り当てた後で、_ucreate を使ってヒープを作成し、 ヒープのメモリー・タイプ、正規メモリーまたは共用メモリーを指定します。 以下に例を示します。

fixedHeap = _ucreate(block, (_HEAP_MIN_SIZE+5000),  /* block to use */
                     !_BLOCK_CLEAN,   /* memory is not set to 0   */
                     _HEAP_REGULAR,   /* regular memory           */
                     NULL, NULL);     /* functions for expanding and shrinking 
                                         a dynamically-sized heap */

!_BLOCK_CLEAN パラメーターは、ブロック内のメモリーが 0 に初期化されていないことを示します。 これが 0 に設定されていた (例えば、memset を使って) 場合には、_BLOCK_CLEAN を指定します。 calloc および _ucalloc 関数は、この情報を使用して関数の効率を高めます。すなわち、メモリーがすでに 0 に初期化されている場合には、関数でメモリーを初期化する必要はありません。

4 番目のパラメーターは、ヒープに含まれるメモリーのタイプが正規 (_HEAP_REGULAR) であるか、または共用 (_HEAP_SHARED) であるかを示します。

正規メモリーには _HEAP_REGULAR を使用します。大半のプログラムは正規メモリーを使用します。 このタイプは、デフォルトのランタイム・ヒープによって提供されます。共用メモリーには _HEAP_SHARED を使用します。共用メモリーのヒープは、プロセス間またはアプリケーション間で共有できます。

固定サイズ・ヒープの場合、最後の 2 つのパラメーターは常に NULL です。

動的サイズ変更ヒープ (dynamically-sized heap) の作成

XL C/C++ デフォルト・ヒープでは、malloc 要求で十分なストレージが使用できないときには、 ランタイム環境はシステムから追加ストレージを取得します。 同様に、_heapmin を使ってヒープを最小化したとき、またはプログラムが終了したときには、 そのランタイム環境はオペレーティング・システムにメモリーを戻します。

拡張可能ヒープを作成するときは、この作業を行うために、ユーザーが選択するいずれかの名前でユーザー独自の関数を指定します。 これらの関数に対するポインターを、_ucreate への最後の 2 つのパラメーターとして (固定サイズ・ヒープを作成するために使用した NULL ポインターの代わりに) 指定します。 以下に例を示します。

Heap_t growHeap;
static char block[_HEAP_MIN_SIZE];  /* get block */

growHeap = _ucreate(block, _HEAP_MIN_SIZE,   /* starting block */
                    !_BLOCK_CLEAN,      /* memory not set to 0 */
                    _HEAP_REGULAR,      /* regular memory      */
                    expandHeap,     /* function to expand heap */
                    shrinkHeap);    /* function to shrink heap */
注: ヒープが同じタイプのメモリーを使用し、関数が 1 つのヒープ用に特定して作成されたものでない限り、 複数のヒープに対して同一の拡張および縮小関数を使用することができます。