我想知道差异之间的静态变量和全球变量而言 访问速度空间耗.(如果你想知道我的平台:海湾合作委员会编译器。(I am使用Cygwin与海卫IDE ARM7嵌入式编程。Triton涉及与海湾合作委员会编译器Java平台,这个平台可以运行。))

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

编辑: OK,给我一个答案在任何微控制器的环境。

有帮助吗?

解决方案

有对于空间没有区别,它们采用相同的量。

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

当然给变量的存储器访问是对全局和静态相同。但是,当你有静态编译器可以优化。当它编译一个模块,它知道模块之外没有函数调用的函数可以改变一个静态变量。所以确切地知道发生了什么,并且例如可以把它放在了函数调用的寄存器。当它是全球性的,你打电话从不同模块中的函数,编译器无法知道它做什么。因此,他必须假定函数访问的变量,并改变它,导致商店和重装。

使用GCC,你可以在同一时间通过所有.c来源,所以它就可以也看到来自不同模块的功能会发生什么函数调用。为了使它工作,你必须立刻.c-combine到除了通过所有-fwhole-program文件。该-fwhole-program使所有全局静态(不模块静态的,而是编译单元静态的,即所有给定.c文件一起)。所述-combine使得模块间分析。

其他提示

空间消耗:基本上没有区别。唯一一次有会是一个空间的问题是,如果你设法让隐藏的N目标文件的静态数据的同一块,那么你得到的N倍增因子,你可能刚刚1副本,如果它是一个单一的全球件数据的。然而,这是一个错误的设计问题。信息隐藏是良好 - 除非该信息不应该被隐藏

访问速度:没有区别

很难猜测或估计。或许,这将需要时间,但我会做对速度的示例项目和测试。同时测试访问速度和空间的循环。与该架构模拟器测试样本项目。

我希望任何区别将来自包装(空间)和缓存(速度)的问题。这两项也可以从其它任何东西,以及出现。

有是否在你所描述的ENV差异当谈到空格即可。静态或全局变量仅消耗的存储器的量相同。

对于速度考虑(,但不是好的做法的),你可以的喜欢全局变量,如果你需要一个文件的外部访问该变种。 (参考文献使用external char my_global_char_placed_else_where;的)

有关更好的做法您使用get / set函数代替,但他们更慢。所以,那么你可以使用的get / set一个VAR是全球从该变种是事实上的全球代码的读者隐藏的宏,但那是kind'a像作弊。但它可以使代码的可读性。

如果你比较隐藏函数内部变种,那么它与将其功能和更多的功能之外可以有机会获得VAR相比没有什么区别。

我自己用的MSP430,ARM7(只是为了测试)和AVR32万分之一发展

什么乔纳森说是不完全正确的。静态和全局变量会(必须)保存在ZI(或RW数据)的区域。编译器倾斜“保持”过来严格寄存器 - 它可能做的是价值加载到注册的所有操作,比保存值回寄存器,使用 - 那是一个编译器的特定优化。即使如此,没有理由为什么编译器不会做也为全局变量:当然,除非ü使其挥发。但随后,在技术上也可以做一个静态变量挥发,所以再没有什么区别。

编辑:噢 - 空间:没有区别

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top