C语言中包含一些常见的关键字,而这类关键字对于整个程序的效率等都会造成一定的影响,因此在C语言编程中需要重点注意。
一、volatile关键字
volatile影响编译器编译的结果,告诉编译器volatile变量是随时可能发生变化的。从而每次都必须从该变量的地址中读取值,而不是直接从寄存器中读取,可以保证特殊地址的稳定访问,不会出错。
主要应用场合:
1、并行设备的硬件寄存器,访问时值已经被其他设备修改,但寄存器中依然是旧值。
2、一个中断服务子程序中会访问的非自动变量
3、多线程应用中被几个任务共享的变量。
主要作用:
1、告诉编译器对此变量不能做任何优化
2、表示用volatile定义的变量会在程序外被改变,每次必须从内存中读取,而不能将其放在cache或寄存器中重复使用。
二、register关键字
register关键字请求编译器尽可能将变量存在CPU内部寄存器中,而不通过内存寻址访问,提高效率。
register修饰符通常用于被频繁使用的变量,可以大大加快存储速度。
注意:
1、register变量必须是能被CPU所接受的类型,变量必须是一个单个的值,且长度应小于或等于整型的长度。
2、register变量可能不存放在内存中,不能用&来获取register变量的地址。
三、static关键字
static关键字的主要作用:
1、修饰变量
对于用static修饰的变量分为全局变量和局部变量,这些变量存在内存的静态区。使用static声明的全局变量,只能被当前文件中的代码调用,且是定义在该定义之后的代码,外部文件即使使用了extern关键字声明也是不能够使用的,其准确的作用域在从定义处到该文件结束。
使用static声明的局部变量,在函数体内部声明的局部变量只能在这个函数体内部使用,不能再其他地方使用,由于有static关键声明,因此在函数结束时,这个静态变量的值并不会被销毁,在下次调用时又能继续调用,合理使用此关键字可以实现一些比较有用的功能,比如在函数内部用于统计此函数的调用次数之类的功能。
2、修饰函数
函数前加static使得函数成为静态函数。此处static的含义不是指存储方式,而是指函数的作用域仅局限于本文件,又称为内部函数,其他文件中无法得到调用。内部函数的好处是:不同人编写的不同函数时,不用担心自己定义的函数会在其他文件中的函数同名。
四、const关键字
const准确的说应该是一个只读的变量,其值在编译时不能被使用,修饰的只读变量。被const修饰的只读变量必须在定义的同时初始化。
且在C语言中,其不能被用于初始化一个数组,因为const定义的也是一个变量,只不过是一个只读变量而已。
编译器通常不为普通const只读变量分配存储空间,而是将他们保存在符号表中,使得其成为一个编译期间的值,没有了存储与读内存的操作,使得它效率也很高。
const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是像define一样给出的是一个立即数。const定义的只读变量在程序运行过程中只有一份拷贝,存放在静态区。
使用示例:
const修饰数组:定义或说明一个只读数组 int const a[]={};const int a[]={};
const修饰指针:
const int *p; //p可变,p指向的对象不可变
int const *p; //p可变,p指向的对象不可变
int * const p; //p不可变,p指向的对象可变
const int * const p; //p和p指向的对象都不可变
const修饰函数的参数:const修饰符修饰函数的参数时,告诉该参数在函数体中不能改变,防止了使用者的一些无意的或错误的修改。
const修饰函数的返回值:返回值不可被改变。