Длина записи активации - PullRequest
0 голосов
/ 11 января 2010

Я получаю 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 ]

5 голосов
/ 14 января 2010

Я не знаю, каково соглашение вашей книги, но я предполагаю, что всегда есть место для адреса возврата, адреса возвращаемого значения и промежуточных результатов

a) адрес возврата, адрес результата возврата, x, N, k, s, промежуточный результат для s + x [k] = всего 7

б) RET. адрес, адрес результата возврата, a, b, int. Рез. a + b = всего 5

с) в отставке. адрес, адрес результата возврата, х, место для результата возврата fred = всего 4

d) последний не запрашивает у записи активации максимальный требуемый размер стека в любой заданной точке. Он называет сумму, он называет Барни и Барни звонит Фреду, это 7 + 5 + 4 = 16. И 16 + a + x = всего 18 мест для запуска этой программы.

Обратите внимание, что эти расчеты основаны на моих диких догадках о конвенции ваших книг.

0 голосов
/ 16 января 2010

Я предполагаю, что одно место, которое вам не хватает в каждом из первых трех назначений, это указатель сохраненного кадра, то есть указатель на текущее местоположение стека до локальных переменных. Указатель кадра должен быть восстановлен при выходе из функции, чтобы адрес возврата действительно находился на вершине стека, прежде чем функция вернется.

Решение последней задачи - это просто максимальная сумма длин записей распределения arl вложенных вызовов. Итак, в этом примере

arl(program) = max(arl(main)+arl(sum), arl(main)+arl(barney)+arl(fred))

sum и barney не вызываются одновременно, поэтому их не нужно добавлять, поскольку запись распределения для sum уже освобождается при выделении записи для barney.

Поскольку arl (main) равно 7 (адрес возврата, указатель сохраненного кадра, массив из 4-х, int), вторая сумма дает большее значение 16. Однако это на два меньше, чем указанный ответ. Может быть, ваша книга дает представление о том, какими должны быть две другие локации.

...