register变量
学习链接
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
关于寄存器变量有以下事项需要注意:
- 为寄存器变量分配寄存器是动态完成的,因此,只有局部变量和形式参数才能定义为寄存器变量。
- 局部静态变量不能定义为寄存器变量,因为一个变量只能声明为一种存储类别。
- 寄存器的长度一般和机器的字长一致,所以,只有较短的类型如int、char、short等才适合定义为寄存器变量,诸如double等较大的类型,不推荐将其定义为寄存器类型。
- CPU的寄存器数目有限,因此,即使定义了寄存器变量,编译器可能并不真正为其分配寄存器,而是将其当做普通的auto变量来对待,为其分配栈内存。当然,有些优秀的编译器,能自动识别使用频繁的变量,如循环控制变量等,在有可用的寄存器时,即使没有使用 register 关键字,也自动为其分配寄存器,无须由程序员来指定。
register变量相关推荐
- C和C++中的register变量和volatile变量理解
一.register关键字修饰变量 首先register是关键字,关键字意味着这样的变量是由编译器处理的.他的作用就是尽量让这个被修饰的变量存放在CPU的寄存器中供程序进行读写,因为他的值很少被修改, ...
- C语言——变量篇(一)变量关键字static、auto、extern、register
前言:笔者最近在看C语言时候遇到了一堆关键字,auto,static,extern,register等等.看上去头皮发麻,在这里整理一下,便于自己理解. 全局变量和局部变量 关于全局变量和局部变量,笔 ...
- Ansible Playbook 变量与 register 详解
ansible 定义变量方式与[多层]变量引用,以及 register 详解 主机规划 主机名称 操作系统版本 内网IP 外网IP(模拟) 安装软件 ansi-manager CentOS7.5 17 ...
- C语言 --- Register 寄存器变量解析
Register 寄存器变量 定义 register声明告诉编译器,它所申明的变量在程序中使用频率较高.其思想是:将register变量到寄存器中,这样可以使程序更小.执行速度更快.但是编译器可以忽略 ...
- 【C语言必经之路——第1节】自动变量(auto)外部变量(extern)静态变量(static)寄存器变量(register)
目录 一.auto变量 二.extern变量 三.static变量 static的作用为: 1.修饰全局变量 2.修饰局部变量 3.修饰函数 四.register变量 一.auto变量 若定义一个局部 ...
- register寄存器变量
对register寄存器变量的总结如下: 1.寄存器变量可以用来优化加速c语言程序 2.声名只需在类型前多加register 即可,eg register int quick; (quick 就是一个 ...
- 浅析C语言的一个关键字——register
1.register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度.例如下面的内存块拷贝代码, /* Procedure for the as ...
- 在c语言中,函数中的自动变量可以赋初值,每调用一次,赋一次初值,计算机二级考试 程序设计基础试题及答案三...
<程序设计基础>考试试卷三 1. 判断下面标识符中哪个是C语言中合法的用户定义标识符: A. a-b B. #abd C. typedef D. _max 2. -b?在内存中占个字节,& ...
- C语言register关键字—最快的关键字
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对.你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很 ...
最新文章
- 使用CSS3美化复选框checkbox
- [ERROR]在删除BizTalk主机之前必须删除其所有实例?
- 《JavaScript高级程序设计》第8-9章
- HALCON示例程序color_fuses.hdev通过颜色对保险丝进行分类
- Qt:error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800
- Construct Maximum Binary Tree
- 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题
- Python开发环境的搭建(win7)
- 2022计算机Java二级考试四十五套题真题【收藏版】(一周裸考计划)
- 小米平板2wifi驱动下载_小米平板2windows系统无线网怎么连接
- 如何把 Mac 中的文件拷贝到NTFS硬盘?
- 你认为3D建模是像程序员一样敲代码吗?你太out了
- LED点阵显示,有关特殊国别(阿拉伯,希伯来,泰文)字符排版和乱码问题解决
- Alios things资料篇
- IT讲师韩顺平:创业不易,尚硅谷延续教育初心
- 抓包精灵app使用教程
- 数据库 - 数据库角色
- 计算机二级Python真题(七)
- 身份证你需要了解的知识点
- HTMLa标签常用的四种链接
热门文章
- 物联网通信协议_物联网架构及五大常用通信协议
- CodingGame - Shadows of the Knight - Episode 1思路
- 中职计算机实训室管理规定,中高职智慧实训室管理系统
- 白话空间统计二十九:空间插值(六)IDW部分完结篇
- java并行任务,Java 并发编程学习(五):批量并行执行任务的两种方式
- 《信号与系统学习笔记》—拉普拉斯变换(二)
- H.265高清网络编码器在视频网站中的应用
- Stunnel 的用法
- qq登录钓鱼php网页,PHP+JS模仿登录钓鱼
- 【搜集】Thinkpad T400恢复盘下载 - [iThinkpad 资源]