wKioL1cdysrifnS2AACTqmDF1pE509.png





C标准规定的关键字有:

wKioL1cdyzyBzn_SAAAsoZeJQSE493.png





wKioL1cd0jSjl6XOAACd36ojkxc683.pngwKiom1cd0sWRiAaOAAEIT7q8g9w812.pngwKioL1cd07KAOIWVAAGrUm1ZA9E777.png

.volatile的本质:

1> 编译器的优化

在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。

当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。

当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

2>volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人。



一、register变量

       关键字regiter请求编译器尽可能的将变量存在CPU的寄存器中。有以下几点注意的地方。

  1. register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。但是,有些机器的寄存器也能存放浮点数。

  2. register变量可能不存放在内存中,所以不能用取址符运算符“ & ”。

  3. 只有局部变量和形参可以作为register变量,全局变量不行。

  4. 静态变量不能定义为register。

二、static

1、修饰变量(局部和全局变量)

1.1、静态全局变量

  在全局数据区分配内存;未经初始化的静态全局变量和全局变量一样都会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化)作用域仅限于变量被定义的文件中。

全局变量和全局静态变量的区别  

  (1全局变量是不显式用static修饰的全局变量,但全局变量 默认是静态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中, 通过extern 全局变量名的声明,就可以使用全局变量。

  (2全局静态变量是显式用static修饰的全局变量,作用域是所在的文件,其他的文件即使用extern声明也不能使用。

1.2、静态局部变量:    在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区),并且只初始化一次。

2、静态函数

  在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。其它文件中可以定义相同名字的函数,不会发生冲突。

3.在c++中:一个static成员只有唯一的一份副本,而不像常规的非static成员那样在每个对象里各有一份副本。

static成员能被所有对象访问到。类的静态成员函数只能访问类的静态成员(变量或函数)(?)。

三:extern:

extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定(函数或语言)。