没有躲过的坑--使用太多的全局变量
2015-11-30 20:54
225 查看
最近在工程中为了达到目的,使用了很多全局变量,导致程序运行效率降低。
在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,C\C++语言还定义了一种变量,不是保存在内存上,而是直接存储在CPU中的寄存器中,这种变量称为寄存器变量。
总觉得有些太low,就Google了一番。
首先我们清楚,有个叫寄存器的东西,如果是变量存储在寄存器上,就相当于直接操作CPU,程序当然会运转的很流畅;计算速度也是很快。
全部变量不是分配在寄存器上的,并且全局变量可以通过指针,函数等对其进行修改。所以尤其对于一些循环,一定要避免频繁使用全局变量。
但是如果又避免不了使用全局变量,那该如何是好?
一个巧妙的方法就是把全局变量赋值给一个临时变量,对临时变量进行操作,最后再将临时变量的值赋给全局变量。
请看代码:
我们可以进行测试,test2的速度优于test1,尤其对于多次使用全局变量的时候。
既然提到了寄存器,现在就简单聊一聊关键字register。
关键字register是C语言引入的,就是建议编译器使用cpu寄存器来存储自动变量:
目的就是为了提高访问变量的速度。
在C++11之前,register在C++中扮演着同样的角色。
在C++11中,register关键字不再表示是寄存器变量,而只是显式指出变量是自动的。与auto关键字的作用相同。
但是为什么又不废除呢?
当然是为了兼容前人所写的代码而已。
在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,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关键字的作用相同。
但是为什么又不废除呢?
当然是为了兼容前人所写的代码而已。
相关文章推荐
- poj2392
- Android安卓蓝牙开发
- block简介
- 《软件需求模式》读书笔记之三
- 工业4.0时代,教育如何改革?
- 第七周实践项目4—队列数组
- NSUserDefaults用户信息存储本地
- 快速复制数据库表中的数据SQL
- Linux kgdb命令
- 进程调度的优先数法和简单轮转法
- 【项目经验】——文本框限制输入字符长度
- 转载AFNetworking源码解析(一)
- 笔记十一(canvas颜色应用基础)
- my first app——用lucene搭建简单的搜索引擎
- scala并发编程第二章习题
- Leetcode题解(三)
- 关于调整互联网、电话订票起售时间的公告
- 奇异值分解的几何解释及其应用
- 微信开发数据收发原理及消息数据格式
- iOS NSURLConnection GET和POST