最近在工程中为了达到目的,使用了很多全局变量,导致程序运行效率降低。
在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,C\C++语言还定义了一种变量,不是保存在内存上,而是直接存储在CPU中的寄存器中,这种变量称为寄存器变量。
总觉得有些太low,就Google了一番。
首先我们清楚,有个叫寄存器的东西,如果是变量存储在寄存器上,就相当于直接操作CPU,程序当然会运转的很流畅;计算速度也是很快。
全部变量不是分配在寄存器上的,并且全局变量可以通过指针,函数等对其进行修改。所以尤其对于一些循环,一定要避免频繁使用全局变量。
但是如果又避免不了使用全局变量,那该如何是好?
一个巧妙的方法就是把全局变量赋值给一个临时变量,对临时变量进行操作,最后再将临时变量的值赋给全局变量。
请看代码:
int f(void);
int g(void);
int errs;
void test1(void)
{
errs += f();
errs += g();
}
void test2(void)
{
int localerrs = errs;
localerrs += f();
localerrs += g();
errs = localerrs;
}
我们可以进行测试,test2的速度优于test1,尤其对于多次使用全局变量的时候。
既然提到了寄存器,现在就简单聊一聊关键字register。
关键字register是C语言引入的,就是建议编译器使用cpu寄存器来存储自动变量:
register int count_fast;
目的就是为了提高访问变量的速度。
在C++11之前,register在C++中扮演着同样的角色。
在C++11中,register关键字不再表示是寄存器变量,而只是显式指出变量是自动的。与auto关键字的作用相同。
但是为什么又不废除呢?
当然是为了兼容前人所写的代码而已。