牛骨文教育服务平台(让学习变的简单)

没有躲过的坑--使用太多的全局变量

最近在工程中为了达到目的,使用了很多全局变量,导致程序运行效率降低。

在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,CC++语言还定义了一种变量,不是保存在内存上,而是直接存储在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关键字的作用相同。

但是为什么又不废除呢? 
当然是为了兼容前人所写的代码而已。