C および C++ のスタックの使用

C と C++ では、いずれもスタックが多く使用されます。例えば、スタックは以下の項目を格納するために使用されます。

Show/hideスタック消費量の推定方法

通常、スタックの消費量を自動的に測定する方法はありません。ただし、スタックの消費量を手動で推定することは可能です。これには、以下の方法があります。

  • --callgraph でリンクすることによって、スタティックコールグラフを生成します。これにより、スタックの消費量をはじめとした、すべての関数に関する情報が示されます。

  • --info=stack または --info=summarystack でリンクすることによって、すべてのグローバルシンボルのスタック消費量のリストを表示します。

  • デバッガを使用して、スタック内の最後の使用可能な場所にウォッチポイントを設定し、そのウォッチポイントがヒットされるかどうかを調べます。

Show/hideスタック消費量を減らす方法

一般に、以下の方法でプログラムのスタック要件を引き下げることができます。

  • 必要とする変数の数が少ない小さな関数を記述する。

  • 関数の任意のポイントで使用される変数の数を最小にする。

  • 大きなローカル構造体または配列を使用しない。

  • C のブロック範囲を使用する。

  • 再帰を避ける。

malloc() および free() を使用すると、大きなローカル構造体または配列の使用を避けることができます。

C のブロック範囲を使用することには、必要な場所でのみ変数を宣言することが含まれます。別個の有効範囲で必要とされるメモリをオーバーラプすることによってスタックの使用を最小にすることができます。

Show/hideデバッガを使用したスタック消費量の推定

デバッガを使用してスタック消費量を推定するには、次の手順を実行します。

  1. 想定を大幅に上回るサイズの領域をスタックに割り当てます。

  2. ゼロや 0xDEADDEAD などの既知の値でスタックを埋めます。

  3. アプリケーションまたはその固定部分を実行します。テスト実行では、スタックの可能な限り多くの部分を使用するようにして下さい。例えば、も深いネスト構造の関数呼び出しと、静的解析で検出されたワーストケースパスを実行するとします。必要に応じて割り込みを生成し、割り込がスタックトレースに記録されるようにします。

  4. アプリケーションの実行が完了した後で、メモリのスタックエリアを検証して、上書きされた既知の値(ゼロまたは 0xDEADDEAD)の数を調べます。スタックの使用済み部分にはガベージが表示され、残りの部分にはゼロまたは 0xDEADDEAD という値が示されます。

  5. 既知のエントリの数を数えて、4 で乗算します。

  6. スタックのサイズ(バイト単位)から、残りの既知のエントリのサイズを減算します。

計算の結果から、メモリ内でスタックがどの程度増大したかがバイト単位で示されます。

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0472EJ
Non-ConfidentialID081711