使用全局变量而不是指针是否有优势?

时间:2016-04-14 07:04:32

标签: c pointers global-variables

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

代码难以阅读,难以维护且难以测试,因为这些功能没有真正的界面描述,但“无处不在”。

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

2 个答案:

答案 0 :(得分:3)

首先,在任何应用程序中都没有理由使用全局非常量变量。全球,如整个计划所用。

但是在某些情况下,static文件范围变量才有意义。请注意,static关键字阻止变量成为全局变量,只有转换单元(表示c文件加上包含的标题)才能用于声明变量。

这些设计有意义的一些例子:

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

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

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

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

您编写大于2k LOC的文件的唯一原因是因为您正在编写某种类型的库,由于某种原因需要将其作为单个文件提供。例如,如果您正在编写标准C库的一个更复杂的库文件。

如果那不是你正在做的事情,那么永远不会任何借口写一个6k的LOC文件,句号。更不用说用复杂的数据类型填充它。

即使在编写类似上面第一种情况的内容时,也没有什么可以阻止您将文件分成几个。大多数情况下,它实际上是" main.c"升级超过2k LOC,那个应该很容易拆分。

所以不幸的是,我怀疑你维护的代码是由初学者编写的。这并不罕见,几乎所有作为专业程序员工作的人都会在前5年左右写出这样的怪物。因为声音程序设计是你经常通过经验学习的东西。

答案 1 :(得分:0)

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