【问题标题】:Is there an advantage in using global variables instead of pointers?使用全局变量而不是指针有优势吗?
【发布时间】:2016-04-14 07:04:32
【问题描述】:

我遇到了一个有 6k 行的源文件,它完全适用于全局变量,并且有很多函数可以操作 void func(void) 但会更改全局变量。一些全局变量是带有结构体和函数指针的结构体,即使是数据也很难很好地掌握。

代码难以阅读、难以维护和测试,因为函数没有真正的接口描述,但“无处不在”。

现在我想知道是否有理由以这种方式编码(完全使用全局变量而不是使用指针作为参数)?它可能更快或更小,还是有其他好处可以使它比带有指针的结构良好的函数更有用?

【问题讨论】:

  • IMO 滥用全局变量并没有太多好处。该程序可能会运行得更快一些,也可能会稍微小一些,但这可能无关紧要。
  • 广泛使用全局变量会导致(如您所说)代码更难测试和维护。全局变量有其用途和目的,但我看不出以您提出的广泛使用方式有任何优势
  • 它认为,代码已经从一个具有全局性的小程序发展而来,然后演变成您的复杂遗产。没有人花时间和精力去重构它,因为它刚刚好用(ncars)。
  • 我怀疑其中一些已经增长。但由于它用于通信协议,它的很大一部分从一开始就存在。并且新实现的函数仍然可以使用指向变量的指针以使其更具可读性。

标签: c pointers global-variables


【解决方案1】:

首先,在任何应用程序中都没有理由使用全局的非常量变量。全局的,对整个程序可用。

但在某些情况下,static 文件范围变量可能有意义。请注意,static 关键字阻止变量成为全局变量,它仅对声明它的翻译单元(即 c 文件加上包含的头文件)可用。

此类设计有意义的一些示例:

  • 在设计自治代码模块(称它们为类、ADT 或其他)时,您可以确定只存在一个实例,将static 文件范围变量用作“穷人的private”可能会很方便。一旦您向调用者提供某种 API,您几乎总是需要私有的内部变量。

    这种做法在嵌入式系统单核编程中很常见。在桌面编程中,可重入代码更为重要。

  • 特殊情况。在调用者和中断服务例程或回调函数之间共享变量时,参数传递可能不是一种选择。然后你别无选择,只能使用static 文件范围变量。

    (这些变量也应该声明为volatile 以防止编译器优化器错误,以防编译器没有意识到 ISR/回调已执行。)


您编写大于 2k LOC 的文件的唯一原因是因为您正在编写某种库,由于某种原因需要作为单个文件交付。例如,如果您正在编写标准 C 库中更复杂的库文件之一。

如果这不是你正在做的,永远没有任何借口来编写 6k LOC 文件,句号。更不用说用复杂的数据类型填充它了。

即使编写类似于上述第一种情况的内容,也没有什么能阻止您将文件拆分为多个。大多数情况下,实际上是“main.c”升级超过 2k LOC,并且应该很容易拆分。

很遗憾,我怀疑您正在维护的代码是由初学者编写的。这并不罕见,几乎每个作为专业程序员工作的人在头 5 年左右都会写出这样的怪物。因为声音程序设计主要是通过经验学习的。

【讨论】:

    【解决方案2】:

    这样做并没有真正的好处。通过使用全局变量可以获得的任何边际性能增益几乎肯定会在编译器进行优化时获得,并且由于其难以辨认和不符合标准,按照您描述的方式编写的代码可能需要数小时才能修改.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2021-11-11
      • 1970-01-01
      • 2018-01-20
      • 2014-05-18
      • 2014-01-27
      • 2011-09-23
      相关资源
      最近更新 更多