存储类关键字(storage class specifier)

储类关键字(storage class specifier 包 括:auto,extern,static,register ,mutable,volatile,restrict以及typedef 。对于typedef,只是说在语句构成上,typedef 声明看起来象 static,extern 等类型的变量声明;而且对于编译器来说,多个存储类关键字不能同时用,所以typedef register int FAST_COUNTER编译通不过。

从变量的作用域 角度(空间)来分,可以分为全局变量局部变量

从变量的存在时间角度(生存期)来分,可以分为静态存储方式动 态存储方式

内存中供用户使用的存储空间分为三部分:程 序区、静态存储区、动态存储区

数据分别存放在静态存储区和动 态存储区中:全局变量全部存放在静态存储区 中,在程序开始执行时给全局变量分配存储区,程序执行完毕就 释放。程序执行过程中它们占据固定的存储单元,而不是动态分配和释放。

而在动态存 储区中存放以下数据:1.函数形式参数;2.自动变量;3.函数调用时的现场保存和返回地址。

数据在内存中的存储方法 两类:静态存储类和动态存储类。具体包含四种:自动的 (auto),静态的(static),寄存器的(register),外部的(extern)。

auto: 在一个代码块内(或在一个函数头部作为参量)声明的 变量,无论有没有存储类修饰符auton,都属于自动存储类。该类具有自动存储时期、代码块的作用域,如未初始化,它的值是不确定的。

static: 静态变量属于静态存储类别,在静态存储区内分配 存储单元;在程序运行期间不释放;在编译时赋初值,即只赋初值一次,在程序运行时它已有初值,按字节将被设定为0;具有代码块的作用域。

register : 寄存器变量是为了提高效率。因为寄存器的存取速度远高于内存的存取速度。注意:

1. 只有局部自动变量和形式参数可以作为寄存器变量。

2.不能定义任意多个寄存器变 量,因为计算机系统中寄存器数目有限。

extern : 外部变量即全局变量,是在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序的末尾。编译时将外部变量分配在静态存储区。extern并不用于 定义变量,而只是用于将外部变量作用域扩展到其它文件中。

volatilerestrict 都 是为了方便编译器的优化:

volatile告诉编译器该被变量除了可被程序修改 意外还可能被其他代理修改,因此,当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不是使用寄存器中的缓存。如果没有声明volatile,系统在给val2赋值的时候可能 直接从寄存器读取x(假定聪明的编译器优化了),而不是从内存的初始位置,那么在两次赋值之间,x完全有可能被被某些编译器未知的因素更改(比如:操作系 统、硬件或者其它线程等)。

restrict: 是 c99引入的,来源于古老的FORTRAN,C++不支持。 它只可以用于限定指针,并表明指针是访问一个 数据对象的唯一且初始的方式。如:
int * restrict restar=(int *)malloc(10*sizeof(int));];//说明restar是访问由malloc()分配的内存的唯一且初始的方式
int ar[10];    int *par=ar;
for(n=0;n<10;n++)
{
   par[n]+=5;
   restar[n]+=5;
   ar[n]*=2;   par[n]+=3;
   restar[n]+=3;
}
因 为restar是访问分配的内存的唯一且初始的方式,那么编译器可以将对restar的操作进行优化:restar[n]+=8;
par并不是访 问数组ar的唯一方式,不能进行优化:   par[n]+=8;}

mutable: 关 键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员。This keyword can only be applied to non-static and non-const data members of a class. If a data member is declared mutable, then it is legal to assign a value to this data member from a const member function. 类里面的数据成员,加上mutable后,const成员函数就可以修改它了。

你可能感兴趣的:(C/C++)