范围是否存储在堆栈中?

时间:2017-11-08 10:54:59

标签: c++ scope stack

我遇到了这句话source

  

表示将函数调用和作用域放在堆栈中

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

2 个答案:

答案 0 :(得分:2)

这句话可以更好地表达。你需要先做一些观察。

  1. 范围是一种语义结构。它定义了您可以使用名称的位置(对于变量,类型,函数等)。这个名称将引用什么。

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

  3. 函数还定义范围,但函数"运行"。因此,它们的上下文必须具有某种运行时表示。

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

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

答案 1 :(得分:0)

答案不是C ++特有的。 C ++在运行之前使用了一个编译模型(至少在概念上,实现可能不同)。在C ++模型中,范围在编译时解析。编译器可以很好地使用某种堆栈数据结构。

在运行时,有一个函数调用堆栈,这通常包含函数返回地址和每个活动函数的局部变量,但在C ++中,此运行时堆栈不需要保留范围。