声明变量全局是否有任何不利之处?

noD*_*ame -4 c++ global-variables

在C++语言中,声明变量全局是否有任何缺点?

void foo()
{
  int a;
  a=10;
}

int a;
void foo()
{
  a=10;
}
Run Code Online (Sandbox Code Playgroud)

他们之间有什么不同?

nar*_*ren 17

为什么在不必要的时候应该避免全局变量

  • 非本地化 - 当各个元素的范围有限时,源代码最容易理解.全局变量可以由程序的任何部分读取或修改,使得难以记住或推理每种可能的用途.
  • 无访问控制或约束检查 - 程序的任何部分都可以获取或设置全局变量,并且可以轻松地删除或忘记有关其使用的任何规则.(换句话说,获取/设置访问器通常比直接数据访问更受欢迎,对于全局数据更是如此.)通过扩展,缺少访问控制极大地阻碍了在您可能希望运行不受信任的代码的情况下实现安全性(例如使用第三方插件).
  • 隐式耦合 - 具有许多全局变量的程序通常在这些变量之间存在紧密耦合,以及变量和函数之间的耦合.将耦合项目分组为有凝聚力的单元通常会带来更好的计划.
  • 并发问题 - 如果多个执行线程可以访问全局变量,则需要同步(并且经常被忽略).当使用全局变量动态链接模块时,即使在几十个不同的上下文中测试的两个独立模块是安全的,组合系统也可能不是线程安全的.
  • 命名空间污染 - 全球名称随处可见.当您认为使用本地(通过拼写错误或忘记声明本地)时,您可能会在不知不觉中最终使用全局,反之亦然.此外,如果您必须将具有相同全局变量名称的模块链接在一起,如果幸运的话,您将收到链接错误.如果您运气不好,链接器将只处理与同一对象同名的所有用途.
  • 内存分配问题 - 某些环境具有内存分配方案,使得全局变量分配变得棘手.在"构造函数"具有除分配之外的副作用的语言中尤其如此(因为,在这种情况下,您可以表示两个全局变量彼此相互依赖的不安全情况).此外,当动态链接模块时,可能不清楚不同的库是否有自己的全局变量实例或者是否共享全局变量.
  • 测试和限制 - 使用全局变量的源更难以测试,因为在运行之间无法轻易建立"干净"的环境.更一般地,利用未明确提供给该源的任何类型的全局服务(例如,读取和写入文件或数据库)的源很难以相同的原因进行测试.对于通信系统,测试系统不变量的能力可能需要同时运行系统的多个"副本",这在任何使用共享服务(包括全局内存)时都会受到很大阻碍,这些共享服务不作为测试的一部分提供共享.

  • 我不认为你打出来了; 会有点引用底部的消息来源. (7认同)