令和4年度 秋期 午前Ⅱ 問21
実装・構築
スタックに関する問題
プログラム言語 C で作成されたプログラム全体で使用するスタックフレームのサイズが,確保したサイズ内に収まっていることを検証したい。各関数が使用するスタックフレームのサイズ情報に加えて,必要となる情報はどれか。
- ア各関数が使用するレジスタの退避領域のサイズ
- イ各関数が使用するローカル変数のサイズ
- ウ各関数の呼出し関係(呼出しツリー)
- エグローバル変数の合計サイズ
答えと解説を見る
✓ これが正解ウ各関数の呼出し関係(呼出しツリー)
解説
呼出しの連なりで積み重なる量を求めるため、呼出しツリーが必要です。
C言語の関数は、呼び出されるたびに自分のスタックフレームをスタックに積み、戻るときに取り除きます。関数Aが関数Bを呼び、BがさらにCを呼ぶと、A、B、Cのスタックフレームが同時に積み重なります。そのため、プログラム全体で必要なスタックの大きさは、呼出しの経路ごとに各関数のスタックフレームのサイズを足し合わせ、その中で最も大きい経路で決まります。この経路を知るには、どの関数がどの関数を呼ぶかという呼出し関係、つまり呼出しツリーが必要です。各関数のサイズに呼出しの経路を組み合わせて最大値を求める、という考え方がポイントです。
ほかの選択肢はなぜ違うのか
- ア各関数が使用するレジスタの退避領域のサイ…:レジスタの退避領域のサイズは、各関数のスタックフレームの中に含まれる情報です。フレームのサイズがわかっていれば改めて必要にはならず、どのフレームが同時に積み重なるかという情報が欠けたままです。
- イ各関数が使用するローカル変数のサイズ:ローカル変数の領域も、各関数のスタックフレームに含まれます。フレームのサイズ情報にすでに入っているので、これを加えても、呼出しの連なりによって積み重なる量を求めることはできません。
- エグローバル変数の合計サイズ:グローバル変数は、スタックではなく静的な領域に置かれるので、スタックの使用量には関係しません。その合計サイズがわかっても、スタックフレームが確保したサイズに収まるかどうかは判断できません。
この問題の用語
- プログラム言語プログラムを書くための文法や記号の体系のこと。目的に合わせて多くの種類があり、Java、C、Pythonなどがよく使われます。
出典:令和4年度 秋期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問21
同じ用語が出る問題
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)