关键字

来源:互联网 发布:mlpc监控软件下载 编辑:程序博客网 时间:2024/05/21 06:23

register:

为什么要声明为register变量:

为了让编译器尽可能的把变量保存在CPU内部寄存器中,这样可以省去了CPU从内存里抓取数据的时间,提高了效率。为什么要说尽可能,因为CPU的内存是有限的,不可能把所有的变量都声明为register变量。

什么时候声明register变量:

当变量被频繁的访问时。

注意事项:

①只能修饰局部变量,不能修饰全局变量和函数;因为全局变量可以被多个任务或者进程访问,只有当前进程知道register变量在哪。

②不能用&去获取一个register修饰的变量地址;因为register变量寄存在寄存器里,而&是获取内存里的地址。

③用register修饰的变量必须是CPU能够接受的类型。


static     保存在数据区的静态数据区,一般未初始化系统默认为0

①修饰一个局部变量时,延长生命周期直到函数结束再释放。

②修饰一个全局变量时,只能在本文件可见,在其他文件不可见。

③修饰一个函数时,只能在本文件调用,其他文件不可调用。


const:

①用const初始化变量一定要初始化。

②const修饰变量,这个变量就是只读变量;只读变量是空间可变,但是不可通过修饰的变量名来修改对应的空间。

③用const来修饰函数形参,可以防止函数在实现过程中修改实参的值。

使用技巧:

const int *p;   //修饰指向的对象,p可变,p指向的对象不可变

int const *p;   //修饰指向的对象,p可变,p指向的对象不可变

int * const p;   //修饰指针p, p不可变,p指向的对象可变

const int * const p; //指针p和p指向的对象都不可变

当const距离谁近的时候,谁就不可变!


typedef:

①提高代码的移植性。

②方便定义变量,把复杂的变量名变简单方便编写程序。

③方便解释变量的意义。


extern:

外部声明,声明变量是在其他文件定义的。

使用时要注意加上数据类型 如 extern int num;


volatile:

什么是volatile 

volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的。

作用:

1 在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile就是告诉编译器这种情况。

2 不做常量合并、常量传播等优化,

3 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值***作,然而对MemoryMapped IO的处理是不能这样优化的。

前面有人说volatile可以保证对内存操作的原子性,这种说法不大准确,其一,x86需要LOCK前缀才能在SMP下保证原子性,其二,RISC根本不能对内存直接运算,要保证原子性得用别的方法,如atomic_inc。何时用:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。









0 0