##没有躲过的坑--使用太多的全局变量
最近在工程中为了达到目的,使用了很多全局变量,导致程序运行效率降低。
在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,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关键字的作用相同。
但是为什么又不废除呢?
当然是为了兼容前人所写的代码而已。
- 前言
- deprecated关键字
- 指针(内存泄露)
- 头文件相互包含(Compiler error C2653: not a class or namespace name)
- 获取一张图片的width和height
- This function or variable may be unsafe.
- 智能指针陷阱
- wstring与string的转换
- windows下chrome浏览器插件不能安装
- 重定义关键字
- 正确释放vector的内存
- 获取设备环境HDC
- 抽象类不能实例化对象(但是你明明定义的不是抽象类)
- 重载赋值运算符的自我赋值
- 程序中的变量未初始化
- 成对使用new和delete时要采取相同的形式
- 意想不到的除数为零
- map的初始化(插入数据)
- 正则表达式截取字符串
- 捕获窗口之外的鼠标消息(钩子还是??)
- 类中的静态成员变量(static or const static)
- 有if就要有else(一定成对)
- map查找结果处理
- 使用using namespace std的坏习惯
- new一个指针数组、以及创建动态二维数组
- 使用太多的全局变量
- 没有及时break出for循环
- vector使用erase后迭代器变成野指针
- C++函数的默认参数(重新定义默认参数)
- 0xC0000005: 读取位置 xxx时发生访问冲突
- std::string初始化、最快速判断字符串为空
- 你开发的软件安装在C盘Program Files (x86)下产生的异常