【问题标题】:A block scoped variable and the activation record [closed]块范围的变量和激活记录[关闭]
【发布时间】:2023-03-10 21:25:02
【问题描述】:

我知道局部变量(连同其他东西)放在activation record 中。并且激活记录必须在函数开始执行之前存在。考虑下面的函数:

void f(void)
{
    int i;
    scanf("%d", &i);
    if (i > 10) {
        int j = 22;
        // do some operations on j here.
    }
    // more code below...
}

查看此函数,似乎变量j 可能存在也可能不存在,这完全取决于用户在运行时的输入。在这种情况下,

  1. 变量j会放在激活记录中吗?
  2. 此实现是否已定义(换句话说,某些编译器是否会生成等效于在 if` 块之外和之上声明的 j 的代码)?
  3. 或者,如果需要,j 会在执行期间简单地分配到堆栈段上吗?但是,在这种情况下,j 将如何在 if 块之后超出范围?

我在 C11 规范中找不到太多关于此的信息。提前致谢。

【问题讨论】:

  • 激活记录本身是实现定义的。
  • 语言标准没有指定任何——这些都是实现细节。
  • 如果在if 块中不再使用j,编译器可以完全优化它。包括 if 块本身。
  • 我什至不知道activation record 是什么,在我的C 之旅中从未听说过它。希望 C 的设计目的是向用户隐藏这些细节。
  • @Stargateur 也没有听说过这个词,但是快速搜索表明它只是堆栈框架的同义词......

标签: c activation-record


【解决方案1】:

如果我没记错的话,激活记录也称为堆栈帧。我相信这些就是答案:

第一季度。变量j会放在激活记录中吗?

A1:是的,除非经过编译器优化。

第二季度。是否定义了这个实现(换句话说,某些编译器会生成等效于在 if` 块之外和之上声明的 j 的代码)吗?

A2:它是实现定义的。取决于编译器和编译器的设置,但在大多数情况下,j 将在激活记录中。

第三季度。或者,如果需要,j 是否会在执行期间简单地分配在堆栈段上?但是,在这种情况下,j 将如何在 if 块之后超出范围?

A3:不,C 中的分配通常不依赖于局部变量的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多