学习链接

register变量

一般情况下,变量的值是存储在内存中的,CPU 每次使用数据都要从内存中读取。如果有一些变量使用非常频繁,从内存中读取就会消耗很多时间,例如 for 循环中的增量控制:

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

执行这段代码,CPU 为了获得 i,会读取 1000 次内存。

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

寄存器、缓存、内存

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

按照与CPU的远近来分,离CPU最近的是寄存器,然后是缓存,最后是内存。

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

而寄存器的数据又来源于内存,于是 CPU <-- 寄存器 <-- 内存,这就是它们之间的信息交换。

那么为什么还需要缓存呢?因为如果频繁地操作内存中同一地址上的数据会影响速度,于是就在寄存器和内存之间设置一个缓存,把使用频繁的数据暂时保存到缓存,如果寄存器需要读取内存中同一地址上的数据,就不用大老远地再去访问内存,直接从缓存中读取即可。

缓存的速度远高于内存,价格也是如此。

注意:缓存的容量是有限的,寄存器只能从缓存中读取到部分数据,对于使用不是很频繁的数据,会绕过缓存,直接到内存中读取。所以不是每次都能从缓存中得到数据,这就是缓存的命中率,能够从缓存中读取就命中,否则就没命中。

关于缓存的命中率又是一门学问,哪些数据保留在缓存,哪些数据不保留,都有复杂的算法。

注意:上面所说的CPU是指CPU核心,从市场上购买的CPU已是封装好的套件,附带了寄存器和缓存,插到主板上就可以用。

从经济和速度的综合考虑,缓存又被分为一级缓存、二级缓存和三级缓存,它们的存取速度和价格依次降低,容量依次增加。购买到的CPU一般会标出三级缓存的容量。

register变量

寄存器的数量是有限的,通常是把使用最频繁的变量定义为 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;
}

运行结果:
pi is 3.141593

关于寄存器变量有以下事项需要注意:

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

register变量相关推荐

  1. C和C++中的register变量和volatile变量理解

    一.register关键字修饰变量 首先register是关键字,关键字意味着这样的变量是由编译器处理的.他的作用就是尽量让这个被修饰的变量存放在CPU的寄存器中供程序进行读写,因为他的值很少被修改, ...

  2. C语言——变量篇(一)变量关键字static、auto、extern、register

    前言:笔者最近在看C语言时候遇到了一堆关键字,auto,static,extern,register等等.看上去头皮发麻,在这里整理一下,便于自己理解. 全局变量和局部变量 关于全局变量和局部变量,笔 ...

  3. Ansible Playbook 变量与 register 详解

    ansible 定义变量方式与[多层]变量引用,以及 register 详解 主机规划 主机名称 操作系统版本 内网IP 外网IP(模拟) 安装软件 ansi-manager CentOS7.5 17 ...

  4. C语言 --- Register 寄存器变量解析

    Register 寄存器变量 定义 register声明告诉编译器,它所申明的变量在程序中使用频率较高.其思想是:将register变量到寄存器中,这样可以使程序更小.执行速度更快.但是编译器可以忽略 ...

  5. 【C语言必经之路——第1节】自动变量(auto)外部变量(extern)静态变量(static)寄存器变量(register)

    目录 一.auto变量 二.extern变量 三.static变量 static的作用为: 1.修饰全局变量 2.修饰局部变量 3.修饰函数 四.register变量 一.auto变量 若定义一个局部 ...

  6. register寄存器变量

    对register寄存器变量的总结如下: 1.寄存器变量可以用来优化加速c语言程序 2.声名只需在类型前多加register 即可,eg register int quick; (quick 就是一个 ...

  7. 浅析C语言的一个关键字——register

    1.register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度.例如下面的内存块拷贝代码, /* Procedure for the as ...

  8. 在c语言中,函数中的自动变量可以赋初值,每调用一次,赋一次初值,计算机二级考试 程序设计基础试题及答案三...

    <程序设计基础>考试试卷三 1. 判断下面标识符中哪个是C语言中合法的用户定义标识符: A. a-b B. #abd C. typedef D. _max 2. -b?在内存中占个字节,& ...

  9. C语言register关键字—最快的关键字

    register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对.你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很 ...

最新文章

  1. 使用CSS3美化复选框checkbox
  2. [ERROR]在删除BizTalk主机之前必须删除其所有实例?
  3. 《JavaScript高级程序设计》第8-9章
  4. HALCON示例程序color_fuses.hdev通过颜色对保险丝进行分类
  5. Qt:error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800
  6. Construct Maximum Binary Tree
  7. 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题
  8. Python开发环境的搭建(win7)
  9. 2022计算机Java二级考试四十五套题真题【收藏版】(一周裸考计划)
  10. 小米平板2wifi驱动下载_小米平板2windows系统无线网怎么连接
  11. 如何把 Mac 中的文件拷贝到NTFS硬盘?
  12. 你认为3D建模是像程序员一样敲代码吗?你太out了
  13. LED点阵显示,有关特殊国别(阿拉伯,希伯来,泰文)字符排版和乱码问题解决
  14. Alios things资料篇
  15. IT讲师韩顺平:创业不易,尚硅谷延续教育初心
  16. 抓包精灵app使用教程
  17. 数据库 - 数据库角色
  18. 计算机二级Python真题(七)
  19. 身份证你需要了解的知识点
  20. HTMLa标签常用的四种链接

热门文章

  1. 物联网通信协议_物联网架构及五大常用通信协议
  2. CodingGame - Shadows of the Knight - Episode 1思路
  3. 中职计算机实训室管理规定,中高职智慧实训室管理系统
  4. 白话空间统计二十九:空间插值(六)IDW部分完结篇
  5. java并行任务,Java 并发编程学习(五):批量并行执行任务的两种方式
  6. 《信号与系统学习笔记》—拉普拉斯变换(二)
  7. H.265高清网络编码器在视频网站中的应用
  8. Stunnel 的用法
  9. qq登录钓鱼php网页,PHP+JS模仿登录钓鱼
  10. 【搜集】Thinkpad T400恢复盘下载 - [iThinkpad 资源]