我想知道静态变量和全局变量之间在访问速度和空间消耗方面的区别。 (如果你想了解我的平台:Windows上的gcc编译器。(我在Windows上使用带有Triton IDE的Cygwin进行ARM7嵌入式编程.Triton在Java平台上带有gcc编译器,可以在Windows上运行。)
(显然我知道来自this question的文件和功能范围)
编辑:确定在任何微控制器/处理器环境中给出答案。
答案 0 :(得分:11)
空间没有区别,它们的数量相同。
但存在速度差异:静态更快。
当然,对变量的内存访问权限与全局变量和静态变量相同。但是当你有静态时,编译器可以进行优化。当它编译模块时,它知道对模块外部的函数没有函数调用可以改变静态变量。所以它确切知道发生了什么,例如将它保存在函数调用的寄存器中。当它是全局的并且您从另一个模块调用函数时,编译器无法知道它的作用。因此,他必须假设函数访问变量并对其进行更改,从而导致存储和重新加载。
使用gcc,您可以同时传递所有.c
个源,这样它就可以看到函数调用对不同模块的函数的影响。要使其工作,您必须同时传递所有.c
个文件-combine
和-fwhole-program
。 -fwhole-program
使所有全局变量都是静态的(不是模块静态,而是编译单元静态,即所有给定的.c
个文件在一起)。 -combine
进行模块间分析。
答案 1 :(得分:1)
空间消耗:基本没什么区别。唯一一次出现空间问题的是,如果你设法获得隐藏在N个目标文件中的同一块静态数据,那么你得到的乘法因子为N,如果它只是一个全局的那么你可能只有一个副本数据的。但是,这是一个错误的设计问题。信息隐藏是好的 - 除非不应隐藏信息。
访问速度:没有区别。
答案 2 :(得分:1)
很难猜测或估计。这可能需要一些时间,但我会制作一个示例项目并测试速度。使用循环测试访问速度和空间。使用该架构的仿真器测试示例项目。
答案 3 :(得分:1)
我希望任何差异都来自打包(用于空间)和缓存(用于速度)问题。这些也可能来自其他任何事情。
答案 4 :(得分:0)
在空间中,您描述的环境中存在无差异。静态或全局var消耗的内存量相同。
对于速度注意事项(但不是良好做法),如果您需要访问一个文件外的var,则可以更喜欢全局变量 。
(参考使用external char my_global_char_placed_else_where;
)
为了更好的练习,您可以使用get / set函数,但速度较慢。那么你可以使用宏来获取/设置一个全局的var来隐藏var实际上是全局的代码的读者,但这有点像欺骗。但它可以使代码更具可读性。
如果你比较一个函数中隐藏一个var,那么与将它放在函数之外相比它没有区别,更多的函数可以访问var。
我自己使用MSP430,ARM7(仅用于测试)和AVR32微处理器用于开发
答案 5 :(得分:0)
乔纳森所说的并不完全正确。静态和全局变量都将(必须)保存在ZI(或RW数据)区域中。编译器不能严格地将它“保留”在寄存器上 - 它可能做的是将值加载到寄存器中,将该寄存器用于所有操作而不是保存该值 - 这是编译器特定的优化。即使在那时,也没有理由为什么编译器也不会对全局变量这样做:除非当然你使它变得不稳定。但是,从技术上讲,你也可以制作一个静态变量volatile,所以没有区别。
编辑:哦是的 - 空间:没有区别。