6

我想知道静态变量和全局变量在访问速度空间消耗方面的区别。(如果你想知道我的平台:Windows 上的 gcc 编译器。(我使用 Cygwin 和 Triton IDE 在 Windows 上进行 ARM7 嵌入式编程。Triton 在 Java 平台上带有 gcc 编译器,可以在 Windows 上运行。))

(显然我知道这个问题的文件和功能范围)

编辑:好的,给我一个关于任何微控制器/处理器环境的答案。

4

6 回答 6

11

空间没有区别,它们的数量相同。

但是有一个速度差异:静态更快。

当然,对变量的内存访问对于全局和静态来说是一样的。但是当你有静态时编译器可以优化。当它编译一个模块时,它知道对模块外部函数的任何函数调用都不能改变静态变量。所以它确切地知道发生了什么,并且可以例如通过函数调用将其保存在寄存器中。当它是全局的并且您从不同的模块调用函数时,编译器无法知道它的作用。因此,他必须假设函数访问变量并更改它,从而导致存储和重新加载。

使用 gcc 您可以同时传递所有.c源代码,因此它还可以查看函数调用来自不同模块的函数时发生的情况。要使其工作,您必须同时传递所有.c文件-combine-fwhole-program. 这-fwhole-program使得所有全局变量都是静态的(不是模块静态,而是编译单元静态,即所有给定的.c文件一起)。进行模块间分析-combine

于 2008-11-27T08:00:08.990 回答
1

空间消耗:基本没有区别。唯一会出现空间问题的情况是,如果您设法将相同的静态数据块隐藏在 N 个对象文件中,那么您会得到 N 的乘法因子,如果它是单个全局片段,您可能只有 1 个副本数据的。然而,这是一个错误的设计问题。信息隐藏是好的——除非信息不应该被隐藏。

访问速度:没有区别。

于 2008-11-27T07:09:12.103 回答
1

很难猜测或估计。这可能需要时间,但我会制作一个示例项目并测试速度。使用循环测试访问速度和空间。使用该架构的模拟器测试示例项目。

于 2008-11-27T07:10:11.557 回答
1

我希望任何差异都来自打包(空间)和缓存(速度)问题。这两者也可能来自其他任何事物。

于 2008-11-27T07:30:23.980 回答
0

当涉及到space时,您描述的 env没有区别。静态或全局 var 消耗的内存量相同。

出于速度考虑(但不是好的做法) ,如果您需要访问一个文件之外的 var,您可能更喜欢 global vars 。(参考使用external char my_global_char_placed_else_where;

为了更好地练习,您可以使用 get/set 函数,但它们速度较慢。因此,您可以使用宏来获取/设置全局变量,以向代码读者隐藏变量实际上是全局的,但这有点像作弊。但它可以使代码更具可读性。

如果您比较将 var 隐藏在函数内部,那么与将其放在函数外部相比没有区别,并且更多函数可以访问 var。

我自己使用 MSP430、ARM7(仅用于测试)和 AVR32 micros 进行开发

于 2008-11-27T10:13:37.473 回答
0

乔纳森所说的并不完全正确。静态和全局变量都将(必须)保存在 ZI(或 RW 数据)区域中。编译器不能严格地将它“保留”在寄存器上——它可能做的是将值加载到寄存器中,将该寄存器用于所有操作,然后将该值保存回来——这是编译器特定的优化。即便如此,编译器也没有理由对全局变量也这样做:除非你当然让它变得易变。但是,从技术上讲,您也可以将静态变量设为 volatile,因此同样没有区别。

编辑:哦,是的 - 空间:没有区别。

于 2008-12-10T20:39:09.220 回答