C/C++中auto、static、register、extern关键字区别小结

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存取数据就将快的多。
--------------------- 
作者:无鞋童鞋 
来源:CSDN 
原文:https://blog.csdn.net/FX677588/article/details/52687707 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/speargod/article/details/89210757