• 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

  • 相关阅读:
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1009:带余除法
    1007:计算(a+b)×c的值
    1007:计算(a+b)×c的值
    1007:计算(a+b)×c的值
    1006:A+B问题
    1006:A+B问题
    1006:A+B问题
    C# 运算符 ?、??、?: 、?. 、 各种问号的用法和说明
    C# 运算符 ?、??、?: 、?. 、 各种问号的用法和说明
    在C#中??和?分别是什么意思?
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/4140498.html
Copyright © 2020-2023  润新知