目录
区别:
register:这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个 CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多 register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。
volatile:的本意是“易变的”,由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。
所以从作用上来说,这两个关键字的作用是正好相反的,一个是为了最快速递访问,另一个是为了最稳定的访问。
volatile的用途:
一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、在多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
Register的用途:
C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫寄存器变量
寄存器是cpu的存储部件,即是高速缓存,通常不大,最多几mb。定义这个变量适用于频繁使用某个变量,以加快运行速度,因为保存在寄存器中,省去了从内存中调用,要注意定义了这个变量后,不能取地址!!就是不能使用&符号,这与一般不同。
使用这个关键字有以下几点限制:
1.所修饰的变量必须是寄存器所能接受的类型(数据长度必须小于或者等于整型的长度)
2.因为是尽可能放在寄存器里,不一定在内存里,因此不能用取地址运算符“&”来获取register变量的地址