__heapstats()

stdlib.h で定義されるこの関数は、ストレージ割り当てヒープの状態に関する統計情報を表示します。コンパイラのデフォルトの実装では、存在する未使用ブロックの数と、サイズ範囲の見積もり値に関する情報が返されます。

Example 1 は、__heapstats() の出力例を示しています。

Example 1. __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);

Note

まだ出力を送信していないストリームで 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 ライブラリでは拡張としてサポートされています。

Show/hide構文

void __heapstats(int (*dprint)(void *param, char const *format,...), void *param);
Copyright © 2014 ARM. All rights reserved.ARM DUI 0809AJ
Non-ConfidentialID061814