zoukankan      html  css  js  c++  java
  • C语言中register类型的变量有什么意义

    int i;
    for(i=0; i<1000; i++){
        // Some Code
    }


    为了解决这个问题,可以将使用频繁的变量放在CPU的通用寄存器中,这样使用该变量时就不必访问内存,直接从寄存器中读取,大大提高程序的运行效率。

    为了加深对 register 变量的理解,这里有必要讲一下CPU寄存器。

    寄存器是最贴近CPU的,而且CPU只在寄存器中进行存取。寄存的意思是暂时存放数据,不用每次都从内存中取,它是一个临时

    的存放数据的空间。

    那么为什么还需要缓存呢?因为如果频繁地操作内存中同一地址上的数据会影响速度,于是就在寄存器和内存之间设置一个缓

    存,把使用频繁的数据暂时保存到缓存,如果寄存器需要读取内存中同一地址上的数据,就不用大老远地再去访问内存,直接

    从缓存中读取即可。

    注意:缓存的容量是有限的,寄存器只能从缓存中读取到部分数据,对于使用不是很频繁的数据,会绕过缓存,直接到内存中

    读取。所以不是每次都能从缓存中得到数据,这就是缓存的命中率,能够从缓存中读取就命中,否则就没命中。

    register 变量


    来看一个计算 π 的近似值的例子,求解的一个近似公式如下:

    为了提高精度,循环的次数越多越好,可以将循环的增量控制定义为寄存器变量,如下所示:

    #include <stdio.h>
    #include <conio.h>
    
    int main()
    {
        register int i = 0;  // 寄存器变量
        double sign = 1.0, res = 0, ad = 1.0;
    
        for(i=1; i<=100000000; i++)
        {
            res += ad;
            sign=-sign;
            ad=sign/(2*i+1);
        }
    
        res *= 4;
        printf("pi is %f", res);
    
        getch();
        return 0;
    }


    关于寄存器变量有以下事项需要注意:
    1) 为寄存器变量分配寄存器是动态完成的,因此,只有局部变量和形式参数才能定义为寄存器变量。

    3) 寄存器的长度一般和机器的字长一致,所以,只有较短的类型如int、char、short等才适合定义为寄存器变量,诸如double等较大的类型,不推荐将其定义为寄存器类型。
    4) CPU的寄存器数目有限,因此,即使定义了寄存器变量,编译器可能并不真正为其分配寄存器,而是将其当做普通的auto变量来对待,为其分配栈内存。当然,有些优秀的编译器,能自动识别使用频繁的变量,如循环控制变量等,在有可用的寄存器时,即使没有使用 register 关键字,也自动为其分配寄存器,无须由程序员来指定。

  • 相关阅读:
    反射 Reflection
    后台输出的数据进行字符判断,小数点后边是0不显示,不是0显示
    判断input内的字符是不是数字或字母
    手机端底部按钮隐藏与显示
    CSS改变checkbox样式
    js小数取整 小数保留两位
    如何判断打开页面时使用的设备?
    H5 拖放实例
    根据手机系统引入不同的css文件
    HTML 5 video 视频标签全属性详解(转)
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/7895671.html
Copyright © 2011-2022 走看看