4.12 __heapstats()

stdlib.h で定義される __heapstats() 関数は、ストレージ割り当てヒープの状態に関する統計情報を表示します。

構文

void __heapstats(int (*dprint)(void *param, char const *format,...), void *param);

使用法

コンパイラのデフォルトの実装では、存在する未使用ブロックの数と、サイズ範囲の見積もり値に関する情報が返されます。
__heapstats() 関数では、次の出力が生成されます。
32272 bytes in 2 free blocks (avge size 16136) 1 blocks 2^12+1 to 2^13 1 blocks 2^13+1 to 2^14
この出力の 1 行目には、合計バイト数、合計未使用ブロック数、平均サイズが示されています。以降の行には、各ブロックのサイズの見積り値がバイト単位で、範囲として示されています。__heapstats() では、使用ブロック数に関する情報は返されません。
この関数は、出力関数 dprint() を呼び出すことによって結果を出力します。この出力関数は fprintf() と同じように機能する必要があります。dprint() に渡される最初のパラメータは、提供されているポインタ param です。fprintf() 自体を渡すこともできますが、その場合は正しい関数ポインタ型にキャストする必要があります。この型は便宜上 typedef として定義されています。これは、__heapprt と呼ばれます。以下に例を示します。
__heapstats((__heapprt)fprintf, stderr);

まだ出力を送信していないストリームで fprintf() を呼び出すと、ライブラリは内部で malloc() を呼び出して、そのストリーム用のバッファを作成します。この動作が __heapstats() への呼び出し中に行われると、ヒープが破損することがあります。したがって、何らかの出力が stderr に送信されていることを確認する必要があります。
デフォルトである 1 領域メモリモデルを使用する場合、ヒープメモリは必要に応じて割り当てられます。つまり、ヒープの空き容量は、メモリの割り当てと解放を行うたびに変化します。例えば、以下のシーケンスがあるとします。
int *ip; __heapstats((__heapprt)fprintf,stderr);   // 未使用ヒープのサイズの初期値を出力 ip = malloc(200000); free(ip); __heapstats((__heapprt)fprintf,stderr);    // 解放後のヒープのサイズを出力
出力は以下のとおりです。
4076 bytes in 1 free blocks (avge size 4076) 1 blocks 2^10+1 to 2^11 2008180 bytes in 1 free blocks (avge size 2008180) 1 blocks 2^19+1 to 2^20
この関数は C ライブラリ標準にはありませんが、 ARM® C ライブラリでは拡張としてサポートされています。
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.