Gcc 通常如何解析具有相同名称的变量?

Gcc 通常如何解析具有相同名称的变量?,gcc,compiler-construction,scope,runtime,Gcc,Compiler Construction,Scope,Runtime,假设这是我的程序在特定点的调用堆栈: | b = 2 | | c = 3 | <- function f2 | return address | | function args | | ... | | c = 10 | <- function f1 | ... | f1调用f2 当引用变量c时,它是如何解析的?堆栈是自上而下线性搜索以查找范围中第一个名为c的变量,还是有其他机制更有效地

假设这是我的程序在特定点的调用堆栈:

|    b = 2       |
|    c = 3       | <- function f2
| return address |
| function args  |
|     ...        |
|    c = 10      | <- function f1
|     ...        |
f1调用f2

当引用变量c时,它是如何解析的?堆栈是自上而下线性搜索以查找范围中第一个名为c的变量,还是有其他机制更有效地处理这个问题


如果每次搜索堆栈,当引用不存在的变量d时,它会成为开销,因为堆栈将一直被搜索以发现在范围内没有这样的变量。C++中的

< P>,在运行时变量没有名称。变量名仅为方便程序员而存在。变量在代码中有作用域,但在堆栈中没有作用域


因此,在运行时不会搜索堆栈。在编译过程中,变量名被转换成内存地址。

C++,在运行时变量没有名字。变量名仅为方便程序员而存在。变量在代码中有作用域,但在堆栈中没有作用域


因此,在运行时不会搜索堆栈。在编译过程中,变量名被转换成内存地址。

< P> C或C++编译器有组织每个调用帧的困难任务。 它是在源代码中发出与局部变量相关的机器代码时,将局部变量的访问和修改转换为合适的指令,通常使用堆栈或帧指针作为基础

调用帧中的给定位置可以并且通常是,当编译器用于多种目的进行优化时

一些局部变量在调用帧中没有计数器部分:它们只存在于寄存器中。其他的有时会溢出。好东西尽量避免溢出

调用帧布局、寄存器分配、指令调度是优化编译器的困难任务


如果您对x86处理器指令集有点好奇和了解,你可以尝试用一个C++ C++文件TIY.CC编码,并用G++WalfBoffsASM -O-S Ty.CC编译它,然后用GEDIT或Emacs之类的编辑器或类似的寻呼机查看生成的微小S。 它是在源代码中发出与局部变量相关的机器代码时,将局部变量的访问和修改转换为合适的指令,通常使用堆栈或帧指针作为基础

调用帧中的给定位置可以并且通常是,当编译器用于多种目的进行优化时

一些局部变量在调用帧中没有计数器部分:它们只存在于寄存器中。其他的有时会溢出。好东西尽量避免溢出

调用帧布局、寄存器分配、指令调度是优化编译器的困难任务


<>如果你好奇和了解你的x86处理器指令集,你可以尝试编写一个微小的C++文件TiN.CC,并用G++Walff-FibBoSE ASM -O -TiN.CC编译它,然后用GEDIT或Emacs之类的编辑器或更小的寻呼机查看生成的微小S。基于变量的定义位置,而不是分配位置。因为在你的例子中,你没有给出任何定义,所以说不上来


在基于C的语言中,没有嵌套过程会忽略其中一些语言中的thunk问题,因此不会搜索堆栈本身。但是,您可以在单个过程中使用{}字符进行静态范围嵌套,然后使用相对于引用点的最内层范围。否则,它是过程作用域、类作用域,然后是静态/全局作用域。

引用是按作用域解析的,基于定义变量的位置,而不是分配变量的位置。因为在你的例子中,你没有给出任何定义,所以说不上来


在基于C的语言中,没有嵌套过程会忽略其中一些语言中的thunk问题,因此不会搜索堆栈本身。但是,您可以在单个过程中使用{}字符进行静态范围嵌套,然后使用相对于引用点的最内层范围。否则,它是过程作用域、类作用域,然后是静态/全局作用域。

堆栈不被搜索,编译器知道有多少变量,因此函数最终知道第5个局部变量距离堆栈指针48字节。我突然想到了这一点。不要将语言与实现混淆。该语言精确地指定了代码的行为方式,并且会这样做。编译代码时,变量名的任何使用都将替换为相对于当前堆栈帧指针的地址。无需搜索。+1@KerrekSB无需考虑堆栈,范围规则规定1在编译时知道哪个变量i
使用的和2个未定义的变量是编译时错误。这也适用于每一个回答/评论的堆栈!堆栈不被搜索,编译器知道有多少变量,因此函数最终知道第5个局部变量距离堆栈指针48字节。我突然想到了这一点。不要将语言与实现混淆。该语言精确地指定了代码的行为方式,并且会这样做。编译代码时,变量名的任何使用都将替换为相对于当前堆栈帧指针的地址。无需搜索。+1@KerrekSB无需考虑堆栈,范围规则规定1在编译时知道使用了哪个变量,2个未定义的变量是编译时错误。这也适用于每一个回答/评论的堆栈!如果只在运行时分配内存,那么为什么在编译时内存地址可用?我看不到我的答案和你的后续问题之间的联系,尽管这本身很有趣。如果只在运行时分配内存,为什么在编译时内存地址可用?我看不出我的答案和你的后续问题之间有什么联系,尽管这本身就很有趣。