【发布时间】: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 可能存在也可能不存在,这完全取决于用户在运行时的输入。在这种情况下,
- 变量
j会放在激活记录中吗? - 此实现是否已定义(换句话说,某些编译器是否会生成等效于在 if` 块之外和之上声明的
j的代码)? - 或者,如果需要,
j会在执行期间简单地分配到堆栈段上吗?但是,在这种情况下,j将如何在if块之后超出范围?
我在 C11 规范中找不到太多关于此的信息。提前致谢。
【问题讨论】:
-
激活记录本身是实现定义的。
-
语言标准没有指定任何——这些都是实现细节。
-
如果在
if块中不再使用j,编译器可以完全优化它。包括if块本身。 -
我什至不知道
activation record是什么,在我的C 之旅中从未听说过它。希望 C 的设计目的是向用户隐藏这些细节。 -
@Stargateur 也没有听说过这个词,但是快速搜索表明它只是堆栈框架的同义词......
标签: c activation-record