1.11.2 メモリ割り当て関数のヒープの実装の選択

malloc()realloc()calloc()free() は、ヒープの抽象データ型を使用して構築されています。あらかじめ提供されている 2 種類のヒープの実装である、ヒープ 1 とヒープ 2 のいずれかを選択できます。

使用可能なヒープの実装は次のとおりです。
  • デフォルトの実装であるヒープ 1 では、最も小さくかつ単純なヒープマネージャを実装しています。
  • ヒープ 2 は、未使用ブロックの数が増えるに従って malloc() または free() のパフォーマンスコストが対数的に増大する実装です。

malloc()realloc()、および calloc() のデフォルトの実装では、8 バイト境界で整列されたヒープが保持されます。

ヒープ 1

デフォルトの実装であるヒープ 1 では、最も小さくかつ単純なヒープマネージャを実装しています。
ヒープは、昇順アドレスで保持され、1 つにリンクされた一連の未使用ブロックとして管理されます。割り当て方式には、アドレスによる最初適合方式が使用されます。
この実装ではオーバーヘッドを低く抑えられますが、未使用ブロックの数が増えるに従って、malloc() または free() にかかるパフォーマンスコストも大きくなります。割り当て可能な最小ブロックは 4 バイトであり、それに加えて 4 バイトのオーバーヘッドがかかります。100 個を超える未割り当てブロックが必要な場合は、ヒープ 2 を使用することを推奨します。

ヒープ 2

ヒープ 2 は、未使用ブロックの数が増えるに従って malloc() または free() のパフォーマンスコストが対数的に増大する実装です。
割り当て方式には、アドレスによる最初適合方式が使用されます。割り当て可能な最小ブロックは 12 バイトであり、それに加えて 4 バイトのオーバーヘッドがかかります。
ヒープ 2 は、何百という未使用ブロックがあっても処理時間のパフォーマンスをほぼ一定に保つ必要がある場合にお勧めします。この代替標準実装を選択するには、以下のいずれかを使用します。
  • アセンブリ言語からの IMPORT __use_realtime_heap
  • C からの asm(".global __use_realtime_heap\n")
ヒープ 2 のリアルタイムヒープ実装では、ヒープ用に確保する最大のアドレス空間をあらかじめ決めておく必要があります。アドレスの範囲が狭くなればなるほど、アルゴリズムの効率性が増します。
デフォルトでは、ヒープ範囲にはそのヒープの開始位置(__rt_initial_stackheap() または __rt_heap_extend() によってヒープマネージャに渡される、最初のメモリチャンクの開始位置として定義されます)から 16MB が割り当てられます。
ヒープの上下限は以下によって指定されます。
struct __heap_extent {
    unsigned base, range;
};
__value_in_regs struct __heap_extent __user_heap_extent(
    unsigned defaultbase, unsigned defaultsize);
__user_heap_extent() の関数プロトタイプは rt_misc.h に収録されています。
(ヒープ 1 のアルゴリズムでは、ヒープ範囲の上下限を指定する必要がないため、この関数は呼び出されません。)
以下の場合は __user_heap_extent() を実装する必要があります。
  • 16MB のアドレス空間を超える範囲のヒープを必要とする場合
  • 使用するメモリモデルにおいて、最初に提供されるメモリブロックよりも下位アドレスのメモリブロックが提供される可能性がある場合
ヒープに使用するアドレス空間の範囲が狭いと事前にわかっている場合、__user_heap_extent() を実装する必要はありませんが、再定義するとヒープアルゴリズムの速度を上げることができます。
入力パラメータは、このルーチンが定義されていない場合に使用されるデフォルト値となります。例えば、デフォルトのベース値を変更せずに、サイズだけを調整することも可能です。

返されるサイズフィールドは 2 の累乗でなければなりません。ライブラリではこの確認が行われないため、この要件を満たしていないと、予想外のエラーが発生します。サイズとしてゼロが返されると、ヒープ範囲が 4 GB に設定されます。
関連する参考文書
1.11.5 ARM で提供されるヒープおよびヒープを使用するライブラリ関数の使用の回避
4.2 alloca()
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.