前言
register就和它的名字一样,很少出现在代码世界中,通常只会在一些特定的场合才会出现。它是如此地快,以至于CPU都对它刮目相看,但是它有一个致命的缺点,它的速度“看心情”而定,并不是每一次都能让人满意。
一、register的作用
如果一个变量用register来修饰,则意味着该变量会作为一个寄存器变量,让该变量的访问速度达到最快。例如,一个程序逻辑中有一个很大的循环,循环中有几个变量要频繁进行操作,这些变量可以声明为register类型。
二、寄存器变量
寄存器变量是指一个变量直接引用寄存器,也就是对变量名的操作的结果是直接对寄存器进行访问。寄存器是CPU的“亲信”,CPU操作的每一个操作数和操作结果,都由寄存器来暂时保存,最后才写入内存或从内存中读出。也就是说,变量的值通常保存在内存中,CPU对变量进行读取是先将变量的值从内存中读取到寄存器中,再进行运算,运算完后将结果写回内存中。为什么要这么设计,不直接对变量的值在内存中进行运算,而要再借助于寄存器呢?这是由于考虑到性能的问题才这么设计的。在计算机系统中,包含很多种不同类型的存储器,如下图所示:
在计算机中,CPU的运算速度最快,现在常用的CPU都已达3 GHz左右,而相对应的存储器速度却相对慢得多,访问速度最快的寄存器和缓冲,由于其体积较大,不适合大容量的缓冲使用,所以只能通过将二者结合的方式来提高效率。程序代码保存在内存中,当使用数据时,将其送到寄存器,让CPU来访问,使用完毕后,再送回内存保存。C语言允许使用寄存器保存变量的值,很明显这样能大大提高程序的执行速度。但是,寄存器的个数是有限的,X86也就是十几个,AMR最多才37个,我们不可能将全部的变量都声明为寄存器变量,因为其他代码也需要使用寄存器,同样,我们声明的寄存器变量也不一定直接保存在寄存器中,因为寄存器可能全部都被其他代码占用。编译器只能尽量把变量安排在寄存器中。
总结:
在使用寄存器变量时,请注意:
(1)待声明为寄存器变量的类型应该是CPU寄存器所能接受的类型,寄存器变量是单个变量,变量长度应该小于等于寄存器长度。
(2)不能对寄存器变量使用取地址符“&”,因为该变量没有内存地址。
(3)尽量在大量、频繁操作时使用寄存器变量,且声明的变量个数应该尽量少。