打印

为什么要尽量少用全局变量,如何少用全局变量?

[复制链接]
11419|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hugo0chen|  楼主 | 2016-1-27 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
hugo0chen|  楼主 | 2016-1-27 17:28 | 只看该作者
网上说有这两点:
1.由于全局变量,程序运行期间,始终占有那块存储区,所以空间利用率比较低,大量的全局变量,很快就会把内存用光,所以要少用全局变量;
2.全局变量由于每个函数都可以使用,所以任何一个函数的修改,如果修改了全局变量,都有可能影响到其他函数,所以不利于调试。

使用特权

评论回复
板凳
gx_huang| | 2016-1-27 17:45 | 只看该作者
全局变量,互相耦合。
程序各函数最好互相独立,通过简单的参数传递。

使用特权

评论回复
地板
hugo0chen|  楼主 | 2016-1-27 17:55 | 只看该作者
http://blog.csdn.net/sepnineth/article/details/8206245
1 同一份文件里的全局变量,初始化的顺便跟声明顺序有关(也不能断定谁先谁后,视编译器而定,相关介绍编译,链接相关的书籍是xxx)
2 不同文件里的全局变量,无法确定初始化顺序
3 尽量不要使用有依赖的全局变量初始化。
4 访问数据,尽量包装成一个函数访问的习惯。
http://blog.sina.com.cn/s/blog_88cbbb7301011hou.html
1、通过函数参数传递数据或指针。对于回调函数,通常有一个参数是自定义的数据指针,可以利用这个参数传递类指针或者自定义一个结构的指针。
2、只在某一个函数中使用的变量可以定义为局部静态变量(在函数内部定义,前面加static修饰)。
3、把全局变量定义成一个结构,定义一个全局的结构体变量。

使用特权

评论回复
5
diy1997| | 2016-1-27 20:41 | 只看该作者
顺其自然,该用就用。

全局变量不利于模块化。

局部变量调用时才分配,用后还要销毁。

使用特权

评论回复
6
奔牛滚滚| | 2016-1-27 23:27 | 只看该作者
说白了就是自己管好每个资源,实际上外设也是全局变量,只是大家管理外设的好习惯没有用在全局变量上.

使用特权

评论回复
7
pkuzhx| | 2016-1-28 10:34 | 只看该作者
我觉得最主要的是上面说的耦合问题,A函数也可以用g_num,B函数也可以用g_num,有可能A修改了B不知道。
不用全局是一种好习惯,但不是必须。你能保证不出错就好,有些库文件里也会用全局变量。

使用特权

评论回复
8
shauew| | 2016-1-28 10:49 | 只看该作者
函数的不可重入,
可以使用结构体的形式传入函数

使用特权

评论回复
9
hugo0chen|  楼主 | 2016-1-28 11:08 | 只看该作者
shauew 发表于 2016-1-28 10:49
函数的不可重入,
可以使用结构体的形式传入函数

的确在多任务环境下,使用含有全局变量的函数势必不可以。
从方便管理上来说结构体比全局变量有优势,但是结构体也是全局的,占用固定的一段存储空间。从占用内寸上来说,一样的。

使用特权

评论回复
10
shauew| | 2016-1-28 11:39 | 只看该作者
hugo0chen 发表于 2016-1-28 11:08
的确在多任务环境下,使用含有全局变量的函数势必不可以。
从方便管理上来说结构体比全局变量有优势,但 ...

使用特权

评论回复
11
batsong| | 2016-1-28 13:22 | 只看该作者
单片机程序,如果全是自己写其实无所谓,但如果是几个人协作完成一个大规模的程序那就全乱了

使用特权

评论回复
12
pkuzhx| | 2016-1-28 13:37 | 只看该作者
batsong 发表于 2016-1-28 13:22
单片机程序,如果全是自己写其实无所谓,但如果是几个人协作完成一个大规模的程序那就全乱了 ...

这个头像。。

使用特权

评论回复
13
shuiqinghan2012| | 2016-1-28 13:38 | 只看该作者
Mark

使用特权

评论回复
14
7456| | 2016-1-28 13:52 | 只看该作者
耦合度比较高,不利于阅读、更改维护,许多全局变量的更改可以通过函数形式出现,相比之下更加可控。

使用特权

评论回复
15
hyg1984| | 2016-1-28 14:38 | 只看该作者
从本质去理解就知道了。

优秀的程序:  简洁,高效。相关就是结构,ROM,RAM空间和资源的问题。

你的全局变量,会让结构复杂,会占用RAM资源,会让算法复杂,会占用多的ROM。

局部变量可以重复利用,减少RAM占用,对优化算法和结构作用大。

所以,很多高手都会建议初学者尽可能的利用全局变量,也就是建议你越来越优秀,进步,一旦你非常清晰的知道什么时候用全局,什么时候用局部。也往往能说明你对结构,对ROM,对RAM,对算法,有一定的水准和认识。

使用特权

评论回复
16
bli19| | 2016-1-28 15:56 | 只看该作者
这种说法太太以偏概全了,那以后大家都不用全局变量,让栈溢出算了。

使用特权

评论回复
17
xmar| | 2016-1-28 16:10 | 只看该作者
本帖最后由 xmar 于 2016-1-28 16:20 编辑

少用全局变量、不乱用goto,就是为了程序结构化(注)。就像公司组织结构,部门经理职能清晰、单纯为佳,如果部门之间相互交叠、穿梭其结果可想而知。
注:整个程序仅仅用顺序结构、选择结构、循环结构(无论如何都不能有其它结构)和这三种结构的嵌套构成,这种程序称为结构化程序。

使用特权

评论回复
18
dongshan| | 2016-1-28 16:59 | 只看该作者
千万不要犯教条主义错误。

使用特权

评论回复
19
chunyang| | 2016-1-28 17:22 | 只看该作者
全局变量确实应该少用,所有编程语言都应该如此,甚至汇编都需要这么用。全局变量一经定义则永久占用,对内存不足的嵌入式MCU来讲,内存资源很可能颇为紧张。所有变量都用全局定义,一旦内存不足运行就必然出错。当然,全局变量在绝大多数情况下还是必须用的,只是能不用尽量不用。至于,什么情况下该用,什么情况下可以不用,建议楼主先好好看书,自己给出个思路,然后再发帖讨论。

使用特权

评论回复
20
wsnsyy| | 2016-1-28 21:29 | 只看该作者
hugo0chen 发表于 2016-1-27 17:55
http://blog.csdn.net/sepnineth/article/details/8206245
1 同一份文件里的全局变量,初始化的顺便跟声明 ...

可以帮忙举个例子吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

191

帖子

3

粉丝