当前位置: 首页 > 文档资料 > C++大学教程 >

3.10 存储类

优质
小牛编辑
130浏览
2023-12-01

第1章到第3章用标识符作为变量名。变量属性包括名称、类型、长度和值。本章用标识符作为用户自定义的函数名。实际上,程序中的每个标识符还有其他属性,包括存锗类(storageclass)、作用域(scope)和连接(linkage)。

C++提供了4个存储类说明符(storage class specifier):auto、register、extern和static。标识符的存储类说明符可以确定其存储类、范围和连接。

标识符的存储类确定了标识符在内存中存在的时间。有些标识符的存在时间很短,有些则重复生成和删除,有些存在于整个程序的执行期间。

标识符的作用域是程序中能引用这个标识符的区域。有些标识符可以在整个程序中引用,而有些标识符只能在程序中的有限部分引用。

标识符的连接确定多源文件程序(第6章将会讨论)中,只有当前源文件或是在任何正确声明的源文件中识别标识符。

本节介绍4个存储类说明符和两个存储类。3.11节介绍标识符的作用域。

存储类说明符可以分为两个存储类:自动存储类(autmatic storage class)和静态存储类(static storage class)。关键字auto和regtster用来声明自动存储类变量。这种变量在进入声明的块时生成,在块活动期间存在,在退出这个块时删除。

只有变量能作为自动存储类。函数的局部变量和参数通常是自动存储类。存储类说明符auto显式声明变量为自动存储类。例如,下列声明表示float变量x和y是自动存储类的局部变量,即只在定义该变量的函数体中存在:

auto  float  x,y;

局部变量默认为自动存储类,因此关键字auto很少使用。本书余下部分将自动存储类变量简称为自动变量。

性能提示3.3

自动存储可以节省内存,因为自动存储类变量在进入声明的块时生成并在退出这个块时删除。

软件工程视点3.11

自动存储是最低权限原则的例子。变量不用时没有必要放在内存中。

机器语言版本中的数据通常装入寄存器(register)中进行计算和其他处理。

性能提示3.4

存储类说明符register,可以放在自动变量声明之前,让编译器在计算机的高速硬件寄存嚣中而不是内存中保存这个变量。如果能在硬件寄存器中保存计数器、总和等大量使用的变量.则可以消除从内存向寄存器装入变量和将结果返回内存中的重复开销。

常见编程错误3.19

一个标识符使用多个存储类说明符是个语法错误,一个标识符只能使用一个存储类说明符。例如,如果一个标识符设为register,就不能再设为auto。

编译器可以忽略register声明。例如,编译器可用的寄存器个数可能不足。下列声明建议将counter变量放在计算机的寄存器中,不管编译器是否这么做,counter都初始化为1:

register int countcr = 1;

register关键字只能用于局部变量和函数参数。

性能提示3.5

register声明通常是不需要的。如今的优化编译器通常能识别经常使用的变量,并决定将其教在寄存器中而不需要程序员进行register声明。

关键字extern和static是用来声明静态存储类变量和函数的标识符。这种变量从程序开始执行时就存在。对于变量,程序开始执行时就分配和初始化存储空间;对于函数,从程序开始执行时就存在函数名。但是,尽管变量和函数名从程序开始执行时起就存在,但这并不是说这些标识符可以在整个程序中使用。3.11节将会介绍存储类和作用域是两个不同的概念。

静态存储类有两种标识符:外部标识符(如全局变量和函数名)与存储类说明符Static中声明的局部变量。全局变量和函数名默认为存储类说明符extern。全局变量生成时将变量声明放在任何函数定义之外.在整个程序执行期间保存该全局变量的值。全局变量和函数可以由文件中已声明或定义的任何函数引用。

软件工程视点1.12

将变量声明为全局变量而不是局部变量可能发生意料不到的副作用,不需要访问该变量的函数可能有意或意外修改这个变量,一般来说,除了有独特性能要求,否则应避免使用全局变量。

软件工程视点3.13

只在某个函数中使用的变量应声明为该函数中的局都变量,而不是声明为全局变量。
用关键字static声明的局部变量仍然只在定义该变量的函数中使用,但与自动变量不同的是,static局部变量在函数退出时保持其数值。下次调用这个函数时,static局部变量包含上次函数退出时的值。下列语句将局部变量count声明为static,并将其初始化为1。

static int count = 1

所有静态存储类的数字变量默认初始化为0,但也可以由程序员显式初始化(第5章介绍的静态指针变量也是初始化为0)。
存储类说明符extern和static在显式作用于外部标识符时具有特殊意义。第18章将介绍说明符extern和static作用于外部标识符和多源文件程序。