常见限定符

1、const: const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新,只能在定义时进行初始化赋值
2、 violate:** volatile限定符,防止编译器优化对设备寄存器的访问(多线程也能用到)。用volatile限定符修饰变量,就是告诉编译器,即使在编译时指定了优化选项,每次读这个变量仍然要老老实实从内存读取,每次写这个变量也仍然要老老实实写回内存,不能省略任何步骤。
编译优化问题:如果是普通的内存单元,只要程序不去改写它,它就不会变,可以先把内存单元里的值读到寄存器缓存起来,以后每次用到这个值就直接从寄存器读取,这样效率更高,我们知道读寄存器远比读内存要快。另一方面,如果对一个普通的内存单元连续做三次写操作,只有最后一次的值会保存到内存单元中,所以前两次写操作是多余的,可以优化掉。访问设备寄存器的代码这样优化就错了,因为设备寄存器往往具有以下特性:

  • 设备寄存器中的数据不需要改写就可以自己发生变化,每次读上来的值都可能不一样。
  • 连续多次向设备寄存器中写数据并不是在做无用功,而是有特殊意义的
    问题:无法阻止cache优化,因为cache对程序员是透明的
3、static和extern 【常见限定符】static声明变量或标识符为静态的,其有效作用域是目标文件,而全局变量的作用域是跨文件的,可以在多个目标文件中起作用。在函数定义和变量定义前加static可以实现变量和函数的封装。(防止其他目标文件对其进行引用、篡改);
extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。函数声明前可加可不加,但是变量前必须加

    推荐阅读