平成31年度 春期 午前Ⅱ 問21
ソフトウェア開発管理技術
スタックに関する問題
C言語で作成されたプログラム全体で使用するスタックフレームのサイズが,確保したサイズ内に収まっていることを検証したい。各関数が使用するスタックフレームのサイズ情報に加え,必要となる情報はどれか。
- ア各関数が使用するレジスタの退避領域のサイズ
- イ各関数が使用するローカル変数のサイズ
- ウ各関数の呼出し関係(呼出しツリー)
- エグローバル変数の合計サイズ
答えと解説を見る
✓ これが正解ウ各関数の呼出し関係(呼出しツリー)
解説
同時に積まれるフレームの最大量は、呼出しツリーから求めます。
関数が呼び出されるたびに、その関数のスタックフレームがスタックに積まれ、戻ると取り除かれます。プログラム全体で一度に使うスタックの量は、同時に積まれているフレームの合計なので、どの関数がどの関数を呼ぶかという呼出し関係で決まります。各関数のフレームサイズが分かっていても、呼出しツリーを根から葉までたどり、経路ごとにフレームサイズを合計して最大となる経路を見つけないと、最大の使用量は求められません。レジスタの退避領域やローカル変数はフレームの内訳にすぎないので、追加で必要なのは関数どうしの関係の情報だという点で見分けます。
ほかの選択肢はなぜ違うのか
- ア各関数が使用するレジスタの退避領域のサイ…:レジスタの退避領域は、各関数のスタックフレームの中に含まれる内訳です。フレームサイズの情報がすでにあるので、改めて加えても、何段重なるかを決める材料にはなりません。
- イ各関数が使用するローカル変数のサイズ:ローカル変数の領域も、各関数のスタックフレームの一部です。フレームサイズが与えられている以上、ローカル変数のサイズを加えても、同時にいくつのフレームが積まれるかは分かりません。
- エグローバル変数の合計サイズ:グローバル変数はスタックではなく静的な領域に置かれるので、スタックフレームの大きさとは関係しません。合計サイズが分かっても、スタックが確保したサイズに収まるかの判断には使えません。
出典:平成31年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問21
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)