ヒープについて
ヒープには、C関数malloc(あるいは関連関数)かC++の演算子newを使用して割り当てられた動的データが格納されます。
アプリケーションで動的メモリ割当てを使用する場合には、以下の内容に精通しておく必要があります。
ベーシック、アドバンスト、およびフリーなしヒープのメモリ割当て
ヒープに使用されるリンカセクション
ヒープサイズの割当て。詳細については、ヒープメモリの設定を参照してください。
ヒープメモリハンドラ
システムライブラリには、3つの異なるヒープメモリハンドラ(ベーシック、アドバンスト、およびフリーなしヒープハンドラ)が含まれます。
リンカオプションを使用すると、使用するハンドラを明示的に指定できます。
ベーシックヒープ(
--basic_heap)は非常にシンプルなヒープ割当て機能で、ヒープをあまり使用しないアプリケーションでの使用に適しています。特に、ヒープメモリを割り当てるだけでまったく解放しないアプリケーションに使用できます。ベーシックヒープは特別に速いということはなく、繰り返しメモリを解放するアプリケーションで使用すると、ヒープが不要にフラグメント化する確率が高くなります。ベーシックヒープのコードは、アドバンストヒープの場合に比べて極めて小さいものです。‑‑basic_heapを参照してください。アドバンストヒープ (
‑‑advanced_heap) は、ヒープを重点的に使用するアプリケーションに対して効率的なメモリ管理を提供します。特に、繰り返しメモリを割り当ててそれを解放するアプリケーションの場合、空間と時間の両方でオーバヘッドが少なくなります。アドバンストヒープのコードは、ベーシックヒープの場合に比べて極めて大きくなります。‑‑advanced_heapを参照してください。この定義については、iar_dlmalloc.hを参照してください。フリーなしヒープ (
‑‑no_free_heap)は、一番小さいヒープの実装です。このヒープはfreeまたはreallocをサポートしていません。‑‑no_free_heapを参照してください。
ヒープなしオプションが選択されると、リンカは自動的にヒープハンドラを選びます。
アプリケーションでヒープメモリ割り当てルーチンのコールがあるが、ヒープ割り当て解除ルーチンのコールがない場合は、リンカは、自動的にフリーなしヒープを選択します。
アプリケーションでヒープメモリ割り当てルーチンのコールがあり、ほとんどのモジュールが速度のために最適化される場合は、リンカは自動的にアドバンストヒープを選択します
ヒープメモリ割り当てルーチンのコールがある(ライブラリなど)、またはほとんどのアプリケーションモジュールが最適化レベル「なし」を使用しているか、サイズ(低または高サイズ)が最適化されている場合は、リンカは自動的にベーシックヒープを選びます。
ヒープハンドラの選択に使用する最適化の目標は、リンカにいつでも使用できるわけではありません。特にIARコンパイラでコンパイルされていないオブジェクトファイルではできません。そのようなモジュールは決定時に除外されます。
注記
使用している製品がサイズ制限版のライセンスの場合は、ベーシックヒープが自動的に選択されます。
ヒープサイズと標準I/O
ヒント
「ノーマル」の設定のようにFILE 記述子をDLIBランタイムライブラリから除外すると、I/Oバッファが無効になります。「フル」の設定のように、それ以外の場合は、stdioライブラリのヘッダファイルでI/Oバッファが512バイトに設定されていることに注意する必要があります。ヒープが小さすぎる場合は、I/Oがバッファされず、I/Oがバッファされた場合よりも大幅に低速になります。IAR C-SPY® デバッガのシミュレータドライバを使用してアプリケーションを実行する場合には、速度低下が現れない可能性がありますが、アプリケーションをArmコアで実行すると、速度低下を明確に認識できます。標準I/Oライブラリを使用する場合は、ヒープサイズを標準I/Oバッファの必要に応じたサイズに設定してください。
ヒープアライメント
32ビットモードの場合、ヒープは8バイトのアラインメントされたアドレスにアラインメントされます。
64ビットモードの場合、ヒープは16バイトのアラインメントされたアドレスにアラインメントされます。
ヒープのアライメントについての詳細は、ヒープメモリの設定を参照してください。