作用域存储在堆栈中
Are scopes stored in a stack?
我遇到了这个陈述(来源):
意味着将函数调用和作用域放在堆栈中
但是,如何/为什么要存储范围?
这句话可以更好地表达。您需要先进行一些观察。
-
作用域是一种语义构造。它定义了可以在何处使用名称(对于变量、类型、函数等)。以及这个名字将指的是什么。
-
有不同类型的范围。相当多的只是编译时的事情。例如,命名空间和类也定义了一个作用域。
函数 也定义作用域,但函数"运行"。因此,它们的上下文必须具有某种运行时表示形式。
递归需要调用相同的函数,但对于每个重入调用,函数上下文必须不同。
最后一点是为什么"调用堆栈"通常用于实现函数调用。每个堆栈记录都与正在运行的函数的上下文相关。因此,函数作用域中的名称将引用调用堆栈上的项。
答案并不C++具体。C++在运行之前使用编译模型(至少在概念上,实现可能会有所不同)。在C++模型中,作用域在编译时解析。编译器很可能为此使用某种堆栈数据结构。
在运行时,有一个函数调用堆栈,它通常同时保存函数返回地址和每个活动函数的局部变量,但C++此运行时堆栈不需要保存作用域。
相关文章:
- C++ 在堆栈中包含多态属性的类对象存储
- 是否可以检查存储在堆栈上的单词是否是回文,而C++中没有任何附加数据结构
- 指向存储在堆栈中的变量的指针
- Boost::序列化存储结构时的堆栈溢出错误
- 存储在存储在堆栈中的堆与矩阵中的矩阵可以看作是一系列指针
- 作用域存储在堆栈中
- 优化易失性堆栈变量的存储/构造是否合法
- 是放置在存储在堆栈或堆中的unordered_map中的项目
- 除了堆栈和堆模型之外,还为C++实现了哪些其他形式的自动和动态存储
- 使用堆栈存储对象
- 存储在对象向量上的基于堆栈的指针具有很长的使用寿命
- 将地址存储到矢量中的堆栈分配对象
- C++对象存储在堆栈或堆中
- 为什么存储在 STL 向量中的堆栈分配元素C++即使超出范围也仍然处于活动状态
- 当对象不使用 new 关键字但父对象在堆中时,对象是否存储在堆栈或堆中
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- 为什么这不会导致堆栈溢出?其中是存储的全局向量(堆栈或堆)
- 我将如何在C++03中便携地实现对齐堆栈存储
- 是存储在堆栈上的对象
- 小对象堆栈存储,严格混叠规则和未定义行为