C++中,变量包含两个属性:数据的类型和数据的存储类别;
选择适当的存储分类符,不仅能够提高变量的访问效率,而且还能使内存的存储空间更有效。
存储分类符
定义了变量在内存中的位置,以及程序执行过程中变量起作用的时间,也就是变量的生命周期。
C++中存储分类符有四种:
auto自动类
register寄存器类
static静态类
extern外部类
作用域
即作用范围:是指程序中变量和函数能够起作用的范围。在范围中,变量和函数时可以被访问和存取的,在范围外,不能被访问和存取;
作用域按大小范围可分为4种:
程序级作用域最大(外部函数和外部变量)全局变量
文件级作用域其次(内部函数和外部静态类变量)全局变量
函数级作用域范围都在其所定义的函数体内(自动变量和内部静态变量)局部变量
块级作用域范围在定义的分程序中、if、switch语句中以及循环语句中的定义开始到语句结束为止。(自动变量和内部静态变量)局部变量
各种各样分类符的作用域及其生存期
自动变量
{
auto int i;
int i;
...
}
寄存器变量
{
register int i;
...
}
类似于自动变量,作用域和自动变量一样,属于局部变量。这种变量定义在函数体内或分程序中,定义时前面加上关键字register。
寄存器变量有可能被存放在CPU的通用寄存器中,如果被放到通用寄存器中便可提高存取速度,有利于缩减程序的大小,改进程序的性能。但如果没有被存放到通用寄存器中便按自动变量处理。
notice 寄存器变量能否存放到通用寄存器中取决于当时通用寄存器是否空闲,因此tips:
该变量的数据长度与通用及窜起的长度相当,一般为char或int
定义不要过多,因为通用寄存器个数有限
选择一些实用频度很高的变量有限定义为寄存器变量。
寄存器变量在跳出函数体或分程序后,其所占用的空间就被系统释放,生命期结束。
静态变量
内部静态变量 与自动变量的区别是当内部静态变量离开作用域时,其值仍然保持不变,当程序又调回内部静态变量所在的函数时,内部静态变量中的值是上一次保存的值。
{
static int i;
...
}
外部静态变量 如果外部静态变量在当前文件的函数中被修改,本文件其它函数中的对这个变量的访问也会受到影响。
static int i;
函数名(){
...
}
外部变量
int i;
函数名()
{
...
}
extern int i;
函数名()
{
...
}
定义一个外部变量的方法,是文件的任何一个位置,只要不在函数体中,直接定义一个变量即可,若想在C++中的其他文件使用,只需要使用存储分类法extern 在源文件头部进行变量声明。在一个程序中,外部变量只能被定义一次,但可以被声明多次。
内部函数和外部函数
与函数相关的存储分类 内部函数 外部函数
内部函数在定义其的文件中可被调用,在同一工程的其他文件中不能被调用;
static 数据类型 函数名(参数表)
{
函数体;
}
外部函数作用在整个程序中,可以再组成整个程序的所有文件中进行调用,只需要在调用前声明一次即可。
extern 数据类型 函数名(参数名)
{
函数体;
}