🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
一般情况下,变量的值是存储在内存中的,CPU 每次使用数据都要从内存中读取。如果有一些变量使用非常频繁,从内存中读取就会消耗很多时间,例如 for 循环中的增量控制: ~~~ int i; for(i=0; i<1000; i++){ // Some Code } ~~~ 执行这段代码,CPU 为了获得 i,会读取 1000 次内存。 为了解决这个问题,可以将使用频繁的变量放在CPU的通用寄存器中,这样使用该变量时就不必访问内存,直接从寄存器中读取,大大提高程序的运行效率。 不过寄存器的数量是有限的,通常是把使用最频繁的变量定义为 register 的。 来看一个计算 π 的近似值的例子,求解的一个近似公式如下: ![](http://c.biancheng.net/uploads/allimg/190122/1101091C6-0.gif) 为了提高精度,循环的次数越多越好,可以将循环的增量控制定义为寄存器变量,如下所示: ~~~ #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 关键字,也自动为其分配寄存器,无须由程序员来指定。