作用域存储在堆栈中

Are scopes stored in a stack?

本文关键字:堆栈 存储 作用域      更新时间:2023-10-16

我遇到了这个陈述(来源)

意味着将函数调用和作用域放在堆栈中

但是,如何/为什么要存储范围?

这句话可以更好地表达。您需要先进行一些观察。

  1. 作用域是一种语义构造。它定义了可以在何处使用名称(对于变量、类型、函数等)。以及这个名字将指的是什么。

  2. 有不同类型的范围。相当多的只是编译时的事情。例如,命名空间和类也定义了一个作用域。

  3. 函数
  4. 也定义作用域,但函数"运行"。因此,它们的上下文必须具有某种运行时表示形式。

  5. 递归需要调用相同的函数,但对于每个重入调用,函数上下文必须不同。

最后一点是为什么"调用堆栈"通常用于实现函数调用。每个堆栈记录都与正在运行的函数的上下文相关。因此,函数作用域中的名称将引用调用堆栈上的项。

答案并不C++具体。C++在运行之前使用编译模型(至少在概念上,实现可能会有所不同)。在C++模型中,作用域在编译时解析。编译器很可能为此使用某种堆栈数据结构。

在运行时,有一个函数调用堆栈,它通常同时保存函数返回地址和每个活动函数的局部变量,但C++此运行时堆栈不需要保存作用域。