C语言关键字浅析-register

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Johan_Joe_King/article/details/84131855

### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

register字面意思即计算机科学里讲的寄存器

C语言中有5大存储类:自动类、寄存器类、具有外部链接的静态类、具有内部链接的静态类、空链接的静态类

其中,register是声明寄存器类的寄存器变量的关键字

register的作用是:
声明寄存器变量。

1、为什么会有这种类

众所周知,在经典计算机体系结构中,存储设备的读写速度是有阶级之分的,且受容量、造价等因素影响

通常速度最快的是寄存器,其次是CPU和主存,有时候为了匹配CPU和主存间的速度差距还会在其中间加入高速Cache缓存的设备

对于C语言,虽然它是高级语言中非常底层的一门语言,但其变量也通常都存储在计算机的内存,即主存中

但如果我们把一些经常使用的变量放到寄存器中存储,可能会收获更快的速度和更好的执行效率

这就催生了寄存器变量的产生:

register int q;   /* 在基本数据类型前带上register的帽子表示申请一个寄存器变量 */

void fun(register int q)   /* 可以把一个形参请求为寄存器变量 */

2、寄存器变量的请求

注意说法上的区别,这里的“请求”指的是register只是让这条语句成为对编译器的一个请求,而不是直接指令

编译器会在遇到register后,在请求和可用寄存器(很多计算机体系结构中都有)数量或可用高速内存数量间权衡

所以一定概率上,这个变量不会被使用寄存器存储,这时这个变量会被当做一般变量对待,即存在主存里

3、寄存器变量的局限性

鱼和熊掌不可兼得,一般的,存储设备在获得越高的速度的同时,其容量和其他参数可能会下降

例如寄存器,其速度是存储设备中最快的,但大小可能只有16位或32位(16bit、32bit)

相比较存储设备中几乎最慢的外存,即硬盘(比如机械硬盘),目前容量1T(1024G)以上的硬盘已经是遍地开花了

就算同样是硬盘,固态硬盘比机械硬盘获得了更快的速度,但同时相等造价下的固态硬盘的容量确实普遍低于机械硬盘

回到register的话题,如果一个机器中寄存器的长度为32位,那么我们就不能用其存放一个double类型的数据(64位)

即使同样是整数类型,这样的寄存器也不能存放long long这样的类型,所以可以请求为register存储的类型有局限性

register的局限和限制基本有这几条:

(1)欲申请的register变量必须是CPU能接受的类型,其最好或必须是一个单值,存储长度上要根据机器本身的寄存器而定

通常只能存整型长度及以下的类型的变量,也存在能存浮点类型的寄存器

(2)寄存器与内存不同,不可寻址访问,所以申请成功的register变量不能用&运算符寻址

(3)具备申请为寄存器变量资格的只有局部自动变量(auto类)和形参,全局变量或局部静态变量不可申请为寄存器变量

(4)CPU的可用寄存器数量有限,所以最好不要随意申请若干个寄存器变量,否则申请失败的变量只能成为普通变量

——参考《C Primer Plus第五版》

相关文章:

C语言关键字浅析-auto

C语言关键字浅析-extern

C语言关键字浅析-static

猜你喜欢

转载自blog.csdn.net/Johan_Joe_King/article/details/84131855