分享

全局变量过多的坏处(已整理,清晰版)

 guitarhua 2013-08-15

楼主发表于:2009-08-19 09:52:39大家好,最近看了一个嵌入式工程代码。

发现模块之间的全局变量很多,而且调用特别频繁。

问题:请问各位高手,这样全局变量多会引起什么问题?

#1楼 得分:0回复于:2009-08-19 10:01:38http://zhidao.baidu.com/question/88534681.html
全局变量是使用相同的内存块在整个类中存储一个值.
全局变量的存在主要有以下一些原因:
1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨大对象的全局变量,能避免就一定要避免。
2,使用全局变量程序运行时速度更快一些(因为内存不需要再分配),同样现在也快不了多少。
3,对于局部变量的名字空间污染,这个在不使用太多变量时是可以避免的。
总之,全局变量可以使用,但是全局变量使用时应注意的是尽可能使期名字易于理解,而且不能太短,避免名字空间的污染;避免使用巨大对象的全局变量。
局部变量:在程序中,只在特定的过程或函数中可以访问的变量,是相对与全局变量而言的。
全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。
局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。


#2楼 得分:0回复于:2009-08-19 10:01:52提高了耦合性,牵一发而动全身

#3楼 得分:0回复于:2009-08-19 10:07:06引用 2 楼 hyram 的回复:
提高了耦合性,牵一发而动全身


楼上说的很对,时间久了,代码长了,你都不知道全局变量被哪些函数改过,更怕全局的、起标志作用的变量,处理不好会被害死,同理外部变量比之更甚,尽量不用。不过不是绝对的,如果有清理的逻辑,和必要的时候使用这两种变量会是很好的解决方法。

#4楼 得分:0回复于:2009-08-19 11:02:57提高了模块间的耦合性,对后期维护、扩展和复用都带来极大影响。

比如说你想在新的系统中复用旧系统的模块,你就会发现由于全局变量的存在,单个旧模块极难单独剥离出来;
维护上来说,模块之间的全局变量,你会常常发现修改代码功能时,不同功能对同一全局变量的操作上经常发生冲突。。。

呵呵,这些问题,你维护过一段时间这些代码就有体会了

如果对此类问题感兴趣,推荐去看看《代码大全2》,里面对全局变量的使用有很好的建议;



#5楼 得分:0回复于:2009-08-19 21:03:40不但程序崩溃 人也会崩溃


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:大家都开始C++0x了,我也来凑热闹,今天的主题是《调侃rvalue-reference》

#6楼 得分:0回复于:2009-08-19 23:09:24好处是:便于传递参数,数据能在整个程序中共享。不用很麻烦的传递参数,也省去了传递参数的时间,会减少程序的运行时间。
坏处是:全局变量不好控制,不利于程序的结构化,因为程序中所有的函数都可以随便的修改全局变量,可能导致不可预测的错误,也不便于调试。另外由于全局变量可能会于局部变量冲突,导致程序混乱。

因此一般的建议是尽量不用或少用局部变量。

#7楼 得分:0回复于:2009-08-19 23:15:581楼说的似乎不是真正的麻烦,不知道那个文章写手是谁,不过个人比较赞同2F的观点。至于6楼说的,我不认为“传递参数”是一个麻烦,比较起强耦合带来的麻烦来,传递参数实际上完全不能算有麻烦

#8 楼 得分:0回复于:2009-08-19 23:18:01要记住程序的“正确性”肯定是第一重要的,传递参数如果说有性能损失的话(我个人不认为有多少性能损失),和正确性比较起来实在是微不足 道的。而全局变量带来的模块间的强耦合是造成程序不正确的很大的一个因素
4楼的分析非常有道理

#9楼 得分:0回复于:2009-08-19 23:27:13引用楼主 ctn4611 的回复:
大家好,最近看了一个嵌入式工程代码。

发现模块之间的全局变量很多,而且调用特别频繁。

问题:请问各位高手,这样全局变量多会引起什么问题?

全局变量太多会增加代码维护的困难,也加大了内存的用量,增大程序的体积,某个地方出错,会造成很多地方出错,欲修改某个地方,可能会造成很多地方都要跟着修改。

更多勋章 #10楼 得分:0回复于:2009-08-19 23:38:16最明显的一个问题就是耦合性被增强,代码的维护和可移植性差。


#11楼 得分:0回复于:2009-08-20 00:09:54分析的有道理,UP

#12楼 得分:0回复于:2009-08-20 10:00:31模块间全局变量太多,肯定是模块耦合太多,不利于程序稳定,当出问题的时候也不容易定位问题

#13楼 得分:0回复于:2009-08-20 10:03:27而且如果存在多个模块线程同时修改全局变量的话,也容易造成冲突,需要加线程锁,这样程序的复杂性就高了

#14楼 得分:0回复于:2009-08-20 10:04:01全局变量的值可能在你意想不到的地方改变,这点在多线程编程中显现的尤为突出。

#15楼 得分:0回复于:2009-08-20 17:31:04耦合性变高。不提倡用全局变量。如果你的程序没有全局变量。说明你是高手。否则。只能说程序写的不咋地。


#16楼 得分:0回复于:2009-08-20 17:46:53个人认为LZ的问题有个大的前提,是嵌入式的代码,如果是底层的代码的话,这样效率会好些,当然逻辑上出错的可能性也比较大;如果是上层的代码的话,还是少全局变量好,减少耦合,增大封装。


在现代的面向对象语言如Java,C++,C#,Ruby中,由于变量都是封装在类里面的,对别的类不可见,所以已经几乎完全抛弃了全局变量的概念。然而,可以通过把一个类定义为public static,把类成员变量也定义为public static,使该变量在内存中占用固定、唯一的一块空间,来实现全局变量的功能。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多