1. 说明
以上四种都是变量存储说明符,因为C/C++语言在变量定义时候的完整语法是:
[存储说明符] [数据类型] [变量名称] [=初始化];
因为大多我们声明的变量都是auto变量,而存储说明符默认即auto关键字,所以大多情况下我们省略了auto关键字。例如:
int nNum = 5;
实际定义的完整变量语句为:
auto int nNum =5;
下面我们简单谈谈这四种关键字的区别。
2. 区别
①. auto自动变量:表明变量自动具有本地范围,在离开作用域,无论块作用域,文件作用域还是函数作用域,变量都会被程序隐藏或自动释放。然后等你重新进入该作用域,变量又重新被定义和调用。使用auto变量优势是无需考虑变量是否被释放。
②. static静态变量:简单说就是在函数等调用结束后,该变量也不会被释放,保存的值还保留。即它的生存期是永久的,直到程序运行结束,系统才会释放,但也无需手动释放。
③. register寄存器型变量:这个关键字要求编译器尽可能的将变量存储在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。但是这只是给系统的一个暗示,如果寄存器资源有限,系统也不会满足你的要求。register型变量存取速度比内存快很多,一般你在一些系统库文件,或诸如单片机官方接口库中使用较多,正常我们能用上较少。
④. extern外部变量:它属于变量声明,extern int a和int a的区别就是,前者告诉编译器,有一个int类型的变量a定义在其他地方,如果有调用请去其他文件中查找定义。
3. 总结和注意点
①. 关于extern变量声明使用,例如一个工程中:
Test1.cpp文件开头定义了int i =10; //定义了一个全局变量
Test2.cpp文件中定义:extern int i; //声明在另一个编译单元有i变量
注意:不可以写成extern int i =10,因为变量已经存在,不可以在声明时候赋初始值。
②. 关于static和extern注意地方:
static静态变量虽然和整个程序共生存期,但是作用域还是需要看其定义的地方,当你在某个函数中定义一个变量,该变量作用域仅在该函数中。但你在文件开头定义一个全局变量,该变量作用域仅在该文件中。所以当你声明一个变量调用另一个文件静态变量,编译器会报错的。
③. extern声明尽量写在头文件中:
我们知道头文件只要是存放函数和变量声明的,所以用extern声明的变量也尽量写在头文件中,如果写在cpp文件中容易埋下苦果。
④. 寄存器型变量快的原理:
CPU处理数据的过程是这样,数据是存放在内存当中,CPU从内存里面读取数据先要存放到寄存器中,然后CPU再从寄存器里读取数据来处理。处理完后同样把数据通过寄存器存放到内存里,也就是说CPU和内存数据交换之间存在一个寄存器,并不直接打交道。所以如果我们能够直接将数据存放在寄存器中,CPU存取数据就将快的多。