全局变量何时被认为是良好/推荐的做法?

5 c c++ global-variables

我一直在阅读很多关于为什么全局变量是坏的以及为什么不应该使用它们的原因.然而,大多数常用的编程语言都以某种方式支持全局变量.

所以我的问题是,仍然需要全局变量的原因是什么,它们是否提供了一些无法实现的独特且不可替代的优势?与用户指定的自定义间接相比,从本地范围中检索对象时,全局寻址是否有任何好处?

据我所知,在现代编程语言中,全局寻址与计算内存地址的每个偏移具有相同的性能损失,无论是从"全局"用户内存的开头偏移还是从一个this或任何一个偏移其他指针.因此,就性能而言,用户可以在使用公共指针间接所需的狭窄情况下伪造全局变量,而不会损失实际全局变量的性能.还有什么?真的需要全局变量吗?

pax*_*blo 11

全局变量通常不会因为它们的性能而变坏,它们很糟糕,因为在规模很大的程序中,它们很难将所有内容封装起来 - 信息"泄漏"往往使得很难弄清楚发生了什么.

基本上,变量的范围应该只是代码所需的工作和相对容易理解的内容,而不是更多.将程序中的全局变量打印出十二倍的表格是可以管理的,将它们放在一个数百万行的会计程序中并不是那么好.


Mat*_*son 5

我认为这是另一个相似的主题goto-这是“宗教性的事情”。

有很多方法可以“解决”全局变量,但是如果您仍然在代码的不同位置访问相同的内存,则可能会遇到问题。

全局变量在某些事情上很有用,但一定要“小心”使用(比goto,更要注意,因为滥用的范围更大)。

导致全局变量成为问题的原因有两点:1.很难理解对变量所做的事情。2.在多线程环境中,如果从一个线程写入全局变量,并由其他任何线程读取全局变量,则需要某种形式的同步。

但是有时候全局变量非常有用。例如,具有一个config变量,该变量保存来自应用程序的配置文件的所有配置值。另一种方法是将其存储在某个对象中,该对象从一个函数传递给另一个函数,而这只是多余的工作,不会带来任何好处。特别是如果config变量是只读的。

总体而言,我建议避免使用全局变量。


dor*_*ron 5

全局变量表示全局状态。这使得不可能在程序中存储给定部件或功能局部的重叠状态。

例如,不要打扰,我们将给定用户的凭据存储在整个程序中使用的全局变量中。现在,升级我们的程序以同时允许多个用户将变得更加困难。如果我们只是将用户的状态作为参数传递给我们的函数,那么升级到多个用户的问题就会少很多。