目的は、関数の呼び出しとスタックの消費の関係を調べること。
とりわけ、引数や戻り値の影響に注目しました。
材料に用いたプログラムをリスト5に示します。
[リスト5] | #include<stdio.h> | #include<malloc.h> | void sub1(); | void sub2(int xa); | int sub3(); | void sub4(); | void sub5(int xb); | int sub6(); | int main() { | printf("main : %d\n", stackavail()); | /* sub1(); *//* パターン1: 引数なし、戻り値なし */ | /* sub2(1); *//* パターン2: 引数あり、戻り値なし */ | /* sub3(); *//* パターン3: 引数なし、戻り値あり */ | /* sub4(); *//* パターン4: 2階層のパターン1 */ | /* sub5(1); *//* パターン5: 2階層のパターン2 */ | /* sub6(); *//* パターン6: 2階層のパターン3 */ | return 0; | } | void sub1() { | printf("sub1 : %d\n", stackavail()); | } | void sub2(int xa) { | xa++; | printf("sub2 : %d\n", stackavail()); | } | int sub3() { | printf("sub3 : %d\n", stackavail()); | return 0; | } | void sub4() { | printf("sub4 : %d\n", stackavail()); | sub1(); | } | void sub5(int xb) { | xb++; | printf("sub5 : %d\n", stackavail()); | sub2(xb); | } | int sub6() { | printf("sub6 : %d\n", stackavail()); | sub3(); | return 0; | }
結果は表4のとおり。
[表4] ---------------------------------------------------------- スタック残量表示 パターン main 1階層目 2階層目 ---------------------------------------------------------- mainのみ 2490 sub1(引×戻×) 2490 2488 sub2(引○戻×) 2490 2488 sub3(引×戻○) 2490 2488 sub4(引×戻×,引×戻×) 2490 2488 2488 sub5(引○戻×,引○戻×) 2490 2486 2484 sub6(引×戻○,引×戻○) 2490 2488 2486 ----------------------------------------------------------
sub4のパターンで2階層目のところに変化がないのは、何となく納得できるのですが、sub5のパターンだけ1階層目の減り幅が大きい理由は、よくわかりません。