平成28年度 春期 午前Ⅱ 問24
実装・構築
スタックに関する問題
C言語で作成されたプログラム全体で使用するスタックフレームのサイズが,確保したサイズ内に収まっていることを検証したい。各関数が使用するスタックフレームのサイズ情報に加え,必要となる情報はどれか。
- ア各関数が使用するレジスタの退避領域のサイズ
- イ各関数が使用するローカル変数のサイズ
- ウ各関数の呼出し関係(呼出しツリー)
- エグローバル変数の合計サイズ
答えと解説を見る
✓ これが正解ウ各関数の呼出し関係(呼出しツリー)
解説
最も深い呼出しの経路を求めるため、関数の呼出し関係が必要です。
スタックフレームは関数が呼ばれるたびにスタックに積まれ、その関数から戻ると取り除かれます。見分ける軸は、同時にスタックに積まれるフレームの量を決めるものは何かです。ある関数の中で別の関数を呼ぶと、呼んだ側のフレームを残したまま、呼ばれた側のフレームが上に積まれます。したがって、スタックの使用量が最大になるのは、呼出しが最も深くなる経路をたどったときです。各関数のフレームの大きさに加え、どの関数がどの関数を呼ぶかという呼出し関係があれば、経路ごとのフレームの合計を求め、その最大値を確保したサイズと比べられます。大きさは関数ごとの情報、積み重なり方は呼出し関係、と分けて考えると選べます。
ほかの選択肢はなぜ違うのか
- ア各関数が使用するレジスタの退避領域のサイ…:レジスタの退避領域は、関数が呼ばれたときにスタックフレームの中に確保されるものです。各関数のスタックフレームのサイズにすでに含まれている情報なので、改めて加える必要はありません。
- イ各関数が使用するローカル変数のサイズ:ローカル変数の領域も、スタックフレームの中に置かれるものです。各関数のフレームのサイズとして既に分かっており、足りないのは、そのフレームがどのように積み重なるかという情報です。
- エグローバル変数の合計サイズ:グローバル変数は、スタックではなく、プログラムの実行中ずっと残る静的な領域に置かれます。スタックの使用量とは別に管理されるので、スタックが確保したサイズに収まるかの検証には使いません。
出典:平成28年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問24
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)