static
static,规定此局部变量只在当前模块(文件)中可见.,static规定其为静态存储方式,该变量允许被修改,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;
const
const关键字可以修饰变量、对象、函数等
只读的全局变量,只允许被初始化一次,其值不可修改.
static const
static和const的结合,只读的全局变量,只在当前模块(文件)中可见。
volatile
在介绍这个关键字之前,先介绍一些编译器的优化操作(relase):
1、将内存变量缓存到寄存器,程序在后面需要使用该变量的时候,就从寄存器中取值
2、调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。
1、当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致
2、当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。被声明的变量每次取值操作的时候,是从内存中取值,而不是从寄存器取值
使用场景
1、中断服务程序中修改的供其它程序检测的变量,需要使用 volatile;
2、多任务环境下各任务间共享的标志,应该加 volatile;
3、存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能由不同意义;
重点介绍一下多线程下的volatile
有些变量是用 volatile 关键字声明的。当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,
该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,
一个使用寄存器中的变量,这会造成程序的错误执行。
volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值