Длина записи активации
Я получаю 6,4,3 за первые 3 вопроса соответственно, но я не знаю, как выяснить последний. Тем не менее, руководство по решению указало 7,5,4,18 в качестве ответов.
int sum(int x[], int N) {
int k = 0;
int s = 0;
while (k < N) {
s = s + x[k];
k = k + 1;
}
return s; // the activation record for sum will be ____________ locations
}
int fred(int a, int b) {
return a + b; // (2) the activation record for fred will be ____________ locations
}
void barney(int x) {
x = fred(x, x);//(2) the activation record for barney will be ____________ locations
}
void main(void) {
int a[4];
int x = sum(a, 4);
barney(x);
} // (3) the stack must have at least _____________ locations to run this program
2 ответа
Я не знаю, каково соглашение вашей книги, но я предполагаю, что всегда есть место для обратного адреса, адреса возвращаемого значения и промежуточных результатов.
а) адрес возврата, адрес результата возврата, x, N, k, s, промежуточный результат для s + x[k] = всего 7
б) RET. адрес, адрес результата возврата, a, b, int. Рез. а + б = всего 5
с) RET. адрес, адрес результата возврата, х, место для результата возврата fred = всего 4
d) последний не запрашивает у записи активации максимальный требуемый размер стека в любой заданной точке. Он называет сумму, он называет Барни и Барни звонит Фреду, что составляет 7+5+4 = 16. И 16 + a + x = всего 18 мест для запуска этой программы.
Обратите внимание, что эти расчеты основаны на моих диких догадках о конвенции ваших книг.
Я предполагаю, что единственное местоположение, которое вам не хватает в каждом из первых трех назначений, - это указатель сохраненного фрейма, то есть указатель на текущее местоположение стека до того, как будут выделены локальные переменные. Указатель кадра должен быть восстановлен при выходе из функции, чтобы адрес возврата действительно находился на вершине стека, прежде чем функция вернется.
Решение последней задачи - это просто максимум сумм длин записей размещения, вложенных в вызовы. Итак, в этом примере
arl(program) = max(arl(main)+arl(sum), arl(main)+arl(barney)+arl(fred))
sum и barney не вызываются одновременно, поэтому их не нужно добавлять, поскольку запись распределения для sum уже освобождается, когда выделяется запись для barney.
Поскольку arl(main) равно 7 (адрес возврата, указатель сохраненного кадра, массив из 4-х, int), вторая сумма дает большее значение 16. Однако это на два меньше, чем указанный ответ. Возможно, ваша книга дает вам указание того, какими должны быть два других местоположения.