变量范围

时间:2011-03-03 16:23:57

标签: c

为什么局部变量在C / C ++中使用Stack?

7 个答案:

答案 0 :(得分:6)

从技术上讲,C不使用堆栈。如果查看C99 standard,您将找不到对堆栈的引用。它可能与C ++标准相同,但我还没有检查过它。

堆栈只是大多数编译器用来实现C自动存储语义的实现细节。

答案 1 :(得分:2)

  

本地数据存储 - 子程序经常需要用于存储局部变量值的存储空间,这些变量仅在活动子例程中已知,并且在返回后不保留值。通过简单地移动堆栈的顶部以提供空间来为这种用途分配空间通常是方便的。与堆分配相比,这非常快。请注意,子例程的每个单独激活在本地堆栈中都有自己独立的空间。

堆栈分配要快得多,因为它真正做的就是移动堆栈指针。使用内存池,您可以从堆分配中获得可比较的性能,但这会带来轻微的复杂性和自身的麻烦。

在堆中有另一层间接,因为你必须离开 堆栈 - >在获得正确的对象之前堆。堆栈也是本地的 每个线程都是继承线程安全的,因为堆是免费的 记忆

答案 2 :(得分:2)

您实际问的问题是,“为什么C和C ++ 编译器使用硬件堆栈来存储具有自动扩展名的变量?”

正如其他人所提到的,C和C ++语言定义都没有明确说明变量必须存储在堆栈中。他们只是定义具有不同存储持续时间的变量的行为

6.2.4物体的存放持续时间

1对象具有存储持续时间,用于确定其生命周期。有三个存储空间 持续时间:静态,自动和已分配。分配的存储在7.20.3中描述。

2对象的生存期是存储期间程序执行的一部分 保证为它保留。存在一个对象,具有常量地址,25)并保留 它在其整个生命周期中的最后存储值。 26)如果一个对象被引用到它的外面 一生,行为是不确定的。当指针变为不确定时,指针的值变得不确定 它指向的物体到达其寿命的终点。

3一个对象,其标识符通过外部或内部链接声明,或与 存储类说明符static具有静态存储持续时间。它的一生就是整个 程序执行程序及其存储的值仅在程序之前初始化一次 启动。

4声明标识符的对象,没有链接且没有存储类 说明符static具有自动存储持续时间

5对于没有可变长度数组类型的对象,其生命周期会延长 从进入与之关联的块直到该块的执行结束 无论如何。 (输入一个封闭的块或调用一个函数暂停,但不会结束, 执行当前块。)如果以递归方式输入块,则执行新的实例 每次都创建对象。对象的初始值是不确定的。如果 为对象指定了初始化,每次声明时都会执行初始化 在执行该块时达成;否则,每个值都变得不确定 到达声明的时间。

C语言标准,草稿n1256

毫无疑问,第5段是用硬件堆栈编写的,但有些奇怪的架构不使用硬件堆栈,至少不像x86那样。硬件堆栈简单地使第5段中指定的行为易于实现。

答案 3 :(得分:1)

这取决于存储变量的实现。 有些计算机甚至可能没有“堆栈”:D

除此之外,通常在调用函数时进行一些内务处理以跟踪返回地址以及其他一些事情。许多编译器实现不是为局部变量创建另一个管家方法,而是选择使用已经存在的方法来实现堆栈,只需要很少的更改。

答案 4 :(得分:0)

局部变量是调用堆栈中帧的本地变量。

使用堆栈允许递归。

答案 5 :(得分:0)

因为堆栈是内存的一部分,当范围结束时它将自动丢弃。这就是有时将局部变量称为“自动”的原因。调用中的局部变量与对同一函数的递归或多线程调用“绝缘”。

答案 6 :(得分:0)

局部变量仅限于可以访问它们的范围。 使用堆栈可以将控制从一个范围跳转到另一个范围,并在返回时继续使用最初存在的局部变量。

当有跳转时,推送局部变量并执行跳转。返回范围时,会弹出局部变量。