企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
##没有躲过的坑--使用太多的全局变量 最近在工程中为了达到目的,使用了很多全局变量,导致程序运行效率降低。 在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,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关键字的作用相同。 但是为什么又不废除呢?  当然是为了兼容前人所写的代码而已。