register 用法注意与深入--【sky原创】

register 用法注意与深入:
 
gcc -o test  test.c
 
这样编译的话会报错的,因为寄存器变量是不能取地址的,只有内存的变量才能取地址
寄存器变量取的是虚拟地址
 

#include <stdio.h>

 
int main(void)
{
     register int i;
     int *p = &i;
 
     return 0;
}
 
深入解析:
 
一个变量存储是这样的,运行了一段程序后,就是开启了一个进程,那么这个进程的变量就是要存在进程的虚拟内存中申请,一般我们所说的register定义变量的话,那么变量就是寄存器变量了,这样说会好理解,但是想深入理解,或者是准确理解的话,那样的说法是不正确的,寄存器是什么?是硬件,变量只是一个数,而且是应用层定义的一个变量,我一个关键字就可以直接访问寄存器吗?答案当然不行,那过程到底是怎样的呢?
 
不少资料上说register定义变量可以让变量访问速度更快,因为寄存器速度要远远快于内存的速度,我们一般定义的变量都是存放在内存上面的,如果是访问寄存器的话那速度自然快很多。
 
其实register定义变量的话不一定能让变量作为寄存器变量的,还要看编译器,当编译器满足条件的时候,这样的register关键字才有用,如果编译器没有做处理,你就算定义了register也是没有用 的,
 
下面说具体过程:
 
register定义变量int i后,进程的内存变量 i 就与物理寄存器进行了映射,这是内核完成的,应用层 <--> 内核映射
,然后内核<-->寄存器映射地址映射
 
所以这样register int i;
就相当于是对寄存器进行了读写,是通过内核映射过去的,也就是我们常说的MMU
 
MMU(Memory Management Unit),是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程的操作系统。
 
欢迎与本人交流
 

新浪博客:http://blog.sina.com.cn/u/2049150530
csdn博客:http://blog.csdn.net/u011749143
博客园:http://www.cnblogs.com/sky-heaven/
新浪微博:张昺华--sky
知乎:http://www.zhihu.com/people/zhang-bing-hua

posted @ 2014-12-03 16:53  Sky&Zhang  阅读(2576)  评论(3编辑  收藏  举报