【发布时间】:2021-09-19 09:31:54
【问题描述】:
谁能解释一下来自 Linker and Loaders 的 Levine 的这一部分,第 131 页?
符号信息中最棘手的部分是位置信息。静态变量的位置不会改变,但例程中的局部变量可能是静态的、在堆栈上、在寄存器中或在优化代码中,在例程的不同部分从一个位置移动到另一个位置……
这是否意味着静态局部变量会根据其所属函数的调用而改变其在内存中的位置?
【问题讨论】:
-
static变量,无论是在函数、语句块还是全局中,都不应更改其地址。非静态变量可能会改变它们的地址或可能存储在寄存器中。常见的概念是将所有静态变量放在内存中的同一区域中(因为它们都具有相同的生命周期)。 -
引用是说 local 变量的位置是由编译器决定的。正如引用所说,局部变量可以在处理器的寄存器中、堆栈上、从代码中删除(通过优化)或其他方式。
-
例如,我可以将一个局部变量放入寄存器 0。使用该变量调用一个函数。然后该函数可以将变量复制到寄存器 1,进行一些处理,然后在返回之前复制回寄存器 0。编译器还可以使用 push 和 pop 指令在销毁寄存器内容之前保存寄存器。
-
@camelkos。不会。正如书中所说,静态变量的地址不会改变。无需将变量移动到堆栈即可使用它们。静态变量的范围可能有限(即“局部”变量),但它仍然是静态变量,它与其他静态变量一起放置在数据部分中。
-
您必须区分变量在编译器中的寻址方式(在编译时)与在二进制文件中的寻址方式(在运行时)。在编译器中,它通过其名称来寻址。 IE。在函数内部定义
static变量意味着编译器将拒绝通过函数名称从函数外部访问它。 (这属于范围的主题。)然而,静态变量的生命周期(最迟)是从它的第一次访问到应用程序结束。在运行时...(见上文)。
标签: c++ c makefile compiler-construction loader