auto,static,extern tip

2017-03-30  本文已影响12人  Brucezhang1

在理解这三者之间的作用和区别之前,需要先来理解一个叫做存储类别标识 (Storage-class specifiers)的东西。

存储类别标识:
  • auto - 自动存储周期和我连接(automatic duration and no linkage)

  • register - 自动存储周期和无连接,变量的地址不能获取得到(automatic duration and no linkage, the address of the variable can't be tocken)

  • static - 静态存储周期和在全局声明的内部连接(static duration and internal linkage unless at block scope)

  • extern - 静态存储周期和外部连接 (static duration and extern linkage unless already in internal)
  • _Thread_local - 线程存储周期
  • auto关键字被用在作用域内的局部变量(对象),修饰其为自动存储区域和无连接,这意味着每次执行定义此变量(对象)时,都会产生一个新的变量(对象)并对其进行赋值操作,事实上auto可以省略,即:在不特定指定的情况下,局部变量的存储方式是默认为自动的

  • static关键字声明函数内的变量时,在方法执行期间,static始终保持它的值,并且初始化操作只会在第一次执行时起作用,在随后的操作中,结果经保持上一个语句块执行得到的值。

  • extern关键字定义程序中将要用到但是尚未定义的的外部变量,通常,外部存储类都用于声明在另一个转换单元中定义的变量。
存取周期(Storage duration)
  • 自动存储会在进入作用域后声明变量时被分配内存,在作用域结束退出时释存储的内存,一定是在作用域内变量的声明执行时分配内存而不是仅仅进入到变量的作用域内,并且释放掉内存当离开变量声明的作用域,每一次的循环会重复操作同样的内存的分配和释放。函数的参数以及所有非静态的存储周期都是属于自动存储周期操作

  • 静态存储是在整个程序执行期间存在的,并且在变量中存储的值仅会初始化一次并且指向主函数。针对于c++等面向对象的语言,整个生命周期内仅会有一个对象的实例存在。所有没static修饰的变量(对象)或是内部连接和外部连接都会是这种存储周期

  • 线程存储周期,这种存储周期下,变量(对象)会在线程开始时分配内存和线程结束时释放内存,每个线程都有他自己的不能的变量(对象),如果线程内访问相应的变量(对象)不存在,则会初始化他们,所有声明了_Thread_local的对象都属于此种存储周期。

  • allocated存储周期,这种存储周期下,变量(对象)会依据请求被分配和释放空间。
上一篇 下一篇

猜你喜欢

热点阅读