### 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语言关键字浅析-extern
C语言关键字浅析-static