繁体   English   中英

C中速度和空间消耗方面的静态与全局

[英]Static vs global in terms of speed and space consumption in C

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

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

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

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

但速度存在差异:静态更快。

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

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

空间消耗:基本没什么区别。 唯一一次出现空间问题的是,如果你设法获得隐藏在N个目标文件中的同一块静态数据,那么你得到的乘法因子为N,如果它只是一个全局的那么你可能只有一个副本数据的。 但是,这是一个错误的设计问题。 信息隐藏很好 - 除非不应隐藏信息。

访问速度:没有区别。

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

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

空间方面你所描述的env 没有区别 静态或全局var消耗的内存量相同。

出于速度考虑( 但不是良好实践 ),如果需要访问一个文件外的var ,则可能更喜欢全局变量 (ref使用external char my_global_char_placed_else_where;

为了更好的练习,您可以使用get / set函数,但速度较慢。 那么你可以使用宏来获取/设置一个全局的var来隐藏var实际上是全局的代码的读者,但这有点像欺骗。 但它可以使代码更具可读性。

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

我自己使用MSP430,ARM7(仅用于测试)和AVR32微处理器进行开发

乔纳森所说的并不完全正确。 静态和全局变量都将(必须)保存在ZI(或RW数据)区域中。 编译器不能严格地将它“保留”在寄存器上 - 它可能做的是将值加载到寄存器中,将该寄存器用于所有操作而不是保存该值 - 这是编译器特定的优化。 即使在那时,也没有理由为什么编译器也不会对全局变量这样做:除非当然你使它变得不稳定。 但是,从技术上讲,你也可以制作一个静态变量volatile,所以再没有区别。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM