设为首页 加入收藏

TOP

9.2.2 自动存储持续性(2)
2013-10-07 15:42:17 来源: 作者: 【 】 浏览:81
Tags:9.2.2 自动 存储 持续性

9.2.2  自动存储持续性(2)

在程序清单9.4中,3个texas变量的地址各不相同,而程序使用当前可见的那个变量,因此将113赋给oil( )中的内部代码块中的texas,对其他同名变量没有影响。同样,实际的地址值和地址格式随系统而异。

现在总结一下整个过程。执行到main( )时,程序为texas和year分配空间,使得这些变量可见。当程序调用oil( )时,这些变量仍留在内存中,但不可见。为两个新变量(x和texas)分配内存,从而使它们可见。在程序执行到oil( )中的内部代码块时,新的texas将不可见,它被一个更新的定义代替。然而,变量x仍然可见,这是因为该代码块没有定义x变量。当程序流程离开该代码块时,将释放最新的texas使用的内存,而第二个texas再次可见。当oil( )函数结束时,texas和x都将过期,而最初的texas和year再次变得可见。

使用C++(www.cppentry.com)11中的auto

C++(www.cppentry.com)11中,关键字auto用于自动类型推断,这在第3、7和8章介绍过。但在C语言和以前的C++(www.cppentry.com)版本中,auto的含义截然不同,它用于显式地指出变量为自动存储:

 

由于只能将关键字auto用于默认为自动的变量,因此程序员几乎不使用它。它的主要用途是指出当前变量为局部自动变量。

在C++(www.cppentry.com)11中,这种用法不再合法。制定标准的人不愿引入新关键字,因为这样做可能导致将该关键字用于其他目的的代码非法。考虑到auto的老用法很少使用,因此赋予其新含义比引入新关键字是更好的选择。

1.自动变量的初始化

可以使用任何在声明时其值为已知的表达式来初始化自动变量,下面的示例初始化变量x、y和z:

 

2.自动变量和栈

了解典型的C++(www.cppentry.com)编译器如何实现自动变量有助于更深入地了解自动变量。由于自动变量的数目随函数的开始和结束而增减,因此程序必须在运行时对自动变量进行管理。常用的方法是留出一段内存,并将其视为栈,以管理变量的增减。之所以被称为栈,是由于新数据被象征性地放在原有数据的上面(也就是说,在相邻的内存单元中,而不是在同一个内存单元中),当程序使用完后,将其从栈中删除。栈的默认长度取决于实现,但编译器通常提供改变栈长度的选项。程序使用两个指针来跟踪栈,一个指针指向栈底--栈的开始位置,另一个指针指向堆顶--下一个可用内存单元。当函数被调用时,其自动变量将被加入到栈中,栈顶指针指向变量后面的下一个可用的内存单元。函数结束时,栈顶指针被重置为函数被调用前的值,从而释放新变量使用的内存。

栈是LIFO(后进先出)的,即最后加入到栈中的变量首先被弹出。这种设计简化了参数传递。函数调用将其参数的值放在栈顶,然后重新设置栈顶指针。被调用的函数根据其形参描述来确定每个参数的地址。例如,图9.3表明,函数fib( )被调用时,传递一个2字节的int和一个4字节的long。这些值被加入到栈中。当fib( )开始执行时,它将名称real和tell同这两个值关联起来。当fib( )结束时,栈顶指针重新指向以前的位置。新值没有被删除,但不再被标记,它们所占据的空间将被下一个将值加入到栈中的函数调用所使用(图9.3做了简化,因为函数调用可能传递其他信息,如返回地址)。

 
图9.3  使用栈传递参数
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇9.2.2 自动存储持续性(3) 下一篇9.2.2 自动存储持续性(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)
·C语言中,指针函数和 (2025-12-24 22:20:03)
·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)