2014年(31)
分类: C/C++
2014-03-28 17:46:45
原文地址:单片机全局变量和局部变量的使用 作者:apple_guet
全局变量是存在RAM中的,而局部变量是存在堆栈中的
全局变量是从低地址往高地址存,局部变量是从RAM的高地址往低地址存,如果你定义的变量太多就有可能是溢出了。
在MSP430中,局部变量如果不多,就会分配r4-r15的寄存器,如果数量大就会用压栈处理。
全局变量是使用相同的内存块在整个类中存储一个值.
全局变量的存在主要有以下一些原因:
1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨大对象的全局变量,能避免就一定要避免。
2,使用全局变量程序运行时速度更快一些(因为内存不需要再分配),同样现在也快不了多少。
3,对于局部变量的名字空间污染,这个在不使用太多变量时是可以避免的。
总之,全局变量可以使用,但是全局变量使用时应注意的是尽可能使期名字易于理解,而且不能太短,避免名字空间的污染;避免使用巨大对象的全局变量。
局部变量:在程序中,只在特定的过程或函数中可以访问的变量,是相对与全局变量而言的。
全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。
局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
提高了耦合性,牵一发而动全身
时间久了,代码长了,你都不知道全局变量被哪些函数改过,更怕全局的、起标志作用的变量,处理不好会被害死,同理外部变量比之更甚,尽量不用。不过不是绝对的,如果有清理的逻辑,和必要的时候使用这两种变量会是很好的解决方法。
提高了模块间的耦合性,对后期维护、扩展和复用都带来极大影响。
比如说你想在新的系统中复用旧系统的模块,你就会发现由于全局变量的存在,单个旧模块极难单独剥离出来;
维护上来说,模块之间的全局变量,你会常常发现修改代码功能时,不同功能对同一全局变量的操作上经常发生冲突。。。
呵呵,这些问题,你维护过一段时间这些代码就有体会了
如果对此类问题感兴趣,推荐去看看《代码大全2》,里面对全局变量的使用有很好的建议;
不但程序崩溃 人也会崩溃
好处是:便于传递参数,数据能在整个程序中共享。不用很麻烦的传递参数,也省去了传递参数的时间,会减少程序的运行时间。
坏处是:全局变量不好控制,不利于程序的结构化,因为程序中所有的函数都可以随便的修改全局变量,可能导致不可预测的错误,也不便于调试。另外由于全局变量可能会于局部变量冲突,导致程序混乱。
因此一般的建议是尽量不用或少用局部变量。
我不认为“传递参数”是一个麻烦,比较起强耦合带来的麻烦来,传递参数实际上完全不能算有麻烦
要记住程序的“正确性”肯定是第一重要的,传递参数如果说有性能损失的话(我个人不认为有多少性能损失),和正确性比较起来实在是微不足道的。而全局变量带来的模块间的强耦合是造成程序不正确的很大的一个因素
全局变量太多会增加代码维护的困难,也加大了内存的用量,增大程序的体积,某个地方出错,会造成很多地方出错,欲修改某个地方,可能会造成很多地方都要跟着修改。
最明显的一个问题就是耦合性被增强,代码的维护和可移植性差。
模块间全局变量太多,肯定是模块耦合太多,不利于程序稳定,当出问题的时候也不容易定位问题
而且如果存在多个模块线程同时修改全局变量的话,也容易造成冲突,需要加线程锁,这样程序的复杂性就高了
全局变量的值可能在你意想不到的地方改变,这点在多线程编程中显现的尤为突出。
耦合性变高。不提倡用全局变量。如果你的程序没有全局变量。说明你是高手。否则。只能说程序写的不咋地。
是嵌入式的代码,如果是底层的代码的话,这样效率会好些,当然逻辑上出错的可能性也比较大;如果是上层的代码的话,还是少全局变量好,减少耦合,增大封装。