【发布时间】:2012-02-12 14:00:44
【问题描述】:
假设这是我的程序在特定点的调用堆栈:
| b = 2 |
| c = 3 | <- function f2
| return address |
| function args |
| ... |
| c = 10 | <- function f1
| ... |
f1() 呼叫f2()。
当变量 c 被引用时,它是如何解决的? 堆栈是线性自上而下地查找范围内名为 c 的第一个变量,还是有其他机制需要更有效地处理这个?
如果每次都查找栈,引用一个不存在的变量d会不会是个开销,因为会一直查找栈,发现范围内没有这个变量?
【问题讨论】:
-
堆栈没有被“搜索”,编译器知道有多少变量,所以函数最终知道第 5 个局部变量距离堆栈指针 48 个字节。
-
“想多了”。不要将语言与实现混淆。该语言精确地指定了您的代码的行为方式,并且它将这样做。
-
当你的代码被编译时,任何变量名的使用都会被替换为相对于当前栈帧指针的地址。无需搜索。
-
+1 @KerrekSB 无需考虑堆栈,范围规则规定(1)在编译时知道使用哪个变量,(2)未定义的变量是编译时错误。这也适用于堆栈方面的每个答案/评论!
标签: gcc compiler-construction scope runtime