Memory management 编译器如何解析作用域?

Memory management 编译器如何解析作用域?,memory-management,data-structures,stack,cpu-architecture,Memory Management,Data Structures,Stack,Cpu Architecture,我知道什么是堆栈以及它们是如何工作的。我还知道每个函数在内存中都分配了自己的堆栈,这就是作用域的构成。 但让我困惑的是编译器如何发现这些名称是在这个范围内声明的它是否展开整个堆栈并检查给定名称是否有条目(看起来很累人) 考虑这个代码: void func(int a) { cout<<a; cout<<b; } void func(int a) { cout编译器通过符号表解析变量的作用域。每个作用域都有自己的符号表,这些表根据程序的结构以分层方式组织 当编译器

我知道什么是堆栈以及它们是如何工作的。我还知道每个函数在内存中都分配了自己的堆栈,这就是作用域的构成。 但让我困惑的是编译器如何发现这些名称是在这个范围内声明的它是否展开整个堆栈并检查给定名称是否有条目(看起来很累人) 考虑这个代码:

void func(int a)
{
  cout<<a;
  cout<<b;
}
void func(int a)
{

cout编译器通过符号表解析变量的作用域。每个作用域都有自己的符号表,这些表根据程序的结构以分层方式组织

当编译器想要解析变量的作用域时,它将首先检查它是否存在于当前作用域的符号表中。如果未找到,它将尝试父作用域的符号表,依此类推

每个符号表的搜索速度应该相对较快


有关可视化示例,请参见。

编译器通过符号表解析变量的作用域。每个作用域都有自己的符号表,这些表根据程序的结构以分层方式组织

当编译器想要解析变量的作用域时,它将首先检查它是否存在于当前作用域的符号表中。如果未找到,它将尝试父作用域的符号表,依此类推

每个符号表的搜索速度应该相对较快


有关可视示例,请参阅。

函数没有分配自己的堆栈。函数在进程堆栈上分配堆栈帧。这发生在运行时,而不是编译时。如下面的答案所述,编译器使用符号表的层次结构(或其逻辑等价物)解决作用域问题。函数没有分配自己的堆栈。函数在进程堆栈上分配堆栈帧。这发生在运行时,而不是编译时。如下面的答案所述,编译器使用符号表的层次结构(或其逻辑等价物)来解决作用域问题。