Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 变量范围_C - Fatal编程技术网

C 变量范围

C 变量范围,c,C,为什么局部变量在C/C++中使用堆栈?局部变量是调用堆栈中帧的局部变量 使用堆栈允许递归。因为堆栈是内存的一部分,当作用域结束时,它将被自动释放。这就是有时将局部变量称为“自动”的原因。调用中的局部变量与对同一函数的递归或多线程调用“隔离”。这取决于存储变量的实现。 有些计算机甚至可能没有“堆栈”:D 除此之外,在调用函数跟踪回信地址和其他一些事情时,通常会进行一些内部管理。许多编译器实现没有为局部变量创建另一个内部管理方法,而是选择使用已经存在的方法,该方法实现堆栈,只需进行最小的更改 本地数

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

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


使用堆栈允许递归。

因为堆栈是内存的一部分,当作用域结束时,它将被自动释放。这就是有时将局部变量称为“自动”的原因。调用中的局部变量与对同一函数的递归或多线程调用“隔离”。这取决于存储变量的实现。 有些计算机甚至可能没有“堆栈”:D

除此之外,在调用函数跟踪回信地址和其他一些事情时,通常会进行一些内部管理。许多编译器实现没有为局部变量创建另一个内部管理方法,而是选择使用已经存在的方法,该方法实现堆栈,只需进行最小的更改

本地数据存储–子例程通常需要内存空间来存储本地变量的值,这些变量仅在活动子例程中已知,并且在返回后不保留值。只需将堆栈顶部移动足够的距离以提供空间,就可以方便地为此用途分配空间。这与堆分配相比非常快。请注意,子例程的每个单独激活都会在堆栈中为局部变量获得自己的单独空间

堆栈分配要快得多,因为它真正做的就是移动堆栈指针。使用内存池,您可以从堆分配中获得相当的性能,但这会稍微增加复杂性,并带来一些麻烦。

在堆中还有另一层间接层,因为您必须从 堆栈->堆,然后再获取正确的对象。此外,堆栈是本地的 每个线程都是固有的线程安全的,因为堆对所有线程都是免费的
内存

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

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

< P>您实际上问的是,“为什么C和C++ +Stistabor编译器< /强>使用硬件堆栈来存储具有自动范围的变量?”

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

6.2.4物品的储存期限

1对象的存储持续时间决定其生存期。有三个储藏室 持续时间:静态、自动和已分配。7.20.3中描述了分配的存储。

2对象的生存期是程序执行期间存储被删除的部分 保证为它保留。对象存在,具有恒定地址(25)并保留 它在整个生命周期中的最后一个存储值。26)如果对象在其外部被引用 在生命周期中,行为未定义。指针的值在以下情况下变得不确定: 它指向的对象已到达其生命周期的末尾。

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

4一种对象,其标识符声明时没有链接,也没有存储类 说明符
静态
具有自动存储持续时间。

5对于这种没有可变长度数组类型的对象,其生存期将延长 从进入与其关联的块,直到该块的执行在 无论如何。(输入封闭块或调用函数将挂起,但不会结束, 当前块的执行。)如果以递归方式输入块,则 每次都会创建一个对象。对象的初始值是不确定的。如果 初始化是为对象指定的,每次执行声明时都会执行初始化 在执行区块时达到;否则,该值将变得不确定 到达声明的时间。 C语言标准,草稿


毫无疑问,第5段是在考虑硬件堆栈的情况下编写的,但有些奇怪的体系结构不使用硬件堆栈,至少不像x86那样使用硬件堆栈。硬件堆栈只是使第5段中指定的行为易于实现

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


当存在跳转时,将推送局部变量并执行跳转。返回到作用域时,局部变量会弹出。

没有自动变量-它们会被编译器生成的代码清除。@Andrey,没错,但术语“自动”来自K&RCan始终签出。它有一个关于调用栈的好文章。@ USER363307+ 1没有考虑过。他们还应该使用什么,优先级队列?数学上,函数调用和<代码>返回>代码>在C和C++标准中描述,这就产生了一个必须是栈/LIFO的结构。(带有支持
longjmp
和异常的附加操作。)