【问题标题】:Activation Record Length激活记录长度
【发布时间】:2011-01-03 15:25:01
【问题描述】:

前 3 个问题我分别得到 6,4,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

【问题讨论】:

  • 如果这是一个家庭作业问题(很明显考虑到您的其他问题),至少有礼貌用标签这样说
  • 第一个问题是什么?
  • 如果这是你的导师给你的课程,你应该考虑改变你所在的班级,或者更换导师。
  • 如果不知道更多正在使用的“规则”,这是一个不可能回答的问题。什么是“位置”,每个 int、指针、返回地址等使用了多少个“位置”?可以/将在寄存器中传递多少个(如果有)什么类型的参数?编译器会做像内联和/或死代码消除这样的优化吗?消除死代码后,答案很可能为零(即它是全部死代码)。
  • 天啊,看到 CS 课上发生的事情真是太可怕了。在许多处理器上,您可以想象 sum() 不使用堆栈,只使用寄存器。在其他人相当多的堆栈。但主要是 - 谁在乎答案是 4,5 还是 6。而且可以肯定的是,任何体面的编译器都不会为 fred() 或 barney() 使用堆栈

标签: c activation-record


【解决方案1】:

我不知道你书的约定是什么,但我假设,总是有返回地址、返回值地址和中间结果的地方

a)返回地址,返回结果的地址,x,N,k,s,s的中间结果+x[k]=总计7

b) 保留。 addr,ret 结果的 addr,a,b,int。水库a+b = 总计 5

c) 保留。 addr, ret 结果的 addr, x, fred 返回结果的空间 = 总计 4

d)最后一个不是在任何给定点询问激活记录所需的最大堆栈大小。它调用 sum,它调用 barney,barney 调用 fred,即 7+5+4 = 16。而 16 + a + x = 总共 18 个位置来运行这个程序。

请注意,此计算是基于我对您的书籍惯例的疯狂猜测。

【讨论】:

    【解决方案2】:

    我的猜测是,您在前三个分配中缺少的一个位置是保存的帧指针,即指向当前堆栈位置的指针在分配局部变量之前。函数退出时需要恢复帧指针,使函数返回前返回地址确实在栈顶。

    最后一个任务的解决方案就是嵌套调用的分配记录长度arl之和的最大值。所以,在这个例子中

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

    sum和barney不是同时调用的,所以不需要添加,因为在分配barney的时候,sum的分配记录已经被释放了。

    由于 arl(main) 为 7(返回地址、保存的帧指针、4 个整数的数组、整数),第二个总和给出了更大的值 16。但是,这比指示的答案少 2。也许你的书为您指示其他两个位置应该是什么。

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 1970-01-01
      • 2011-07-14
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      相关资源
      最近更新 更多