在C语言中,全局变量比局部变量更快吗?

6

对此我有几点想法。首先,分配全局变量可能更快,因为它们只在程序第一次启动时分配一次,而本地变量必须每次调用函数时都进行分配。其次,由于本地变量位于堆栈上,因此通过基指针寄存器访问它们,所以每次访问本地变量时都必须将基指针中存储的值减少;而全局变量直接通过数据段中的静态地址进行访问。我的想法准确吗?


3
“是”或“否”可以回答的问题对于SO格式来说是一个“不好”的问题。 - Eugene Sh.
是的,尤其是因为你将任何解释都排除在外。你应该相信自己的理解能力,你对此问题进行了清晰的推理并且合乎逻辑。那么为什么还要问呢? - Iharob Al Asimi
2
这取决于很多因素,但通常来说关注这个问题是毫无意义的。 - Jabberwocky
1
完全取决于缓存行为。根据使用模式,两者都可能比另一种快100倍。 - mnish
3
没有"堆栈"这个说法,只有具有自动存储期限的对象,如果它们的地址从未被引用,它们可以被保存在寄存器中。在几乎所有处理器结构上,访问寄存器比访问具有静态存储期限(如全局变量)的对象所需的内存访问要快得多。 - EOF
2
在堆栈上“分配”一个值并没有额外的工作。堆栈指针只是移动了不同的数字。通过堆栈指针偏移一个值和通过数据段寄存器偏移一个值的访问时间是相同的。所以你的想法大多是错误的。 - stark
1个回答

11
"这很不准确。如果你学习计算机体系结构,你会发现最快的存储是寄存器,其次是高速缓存,再次是RAM。关于局部变量的事情是,编译器会将它们优化为尽可能从寄存器分配,或者如果不行,从高速缓存中分配。这就是局部变量更快的原因。
对于嵌入式系统来说,当然可能会编译成一个小内存模型,这样您的数据段可能适合于现代控制器的SRAM缓存中。但在这种情况下,您的局部变量使用也将非常紧密,以至于它们可能完全在寄存器上运行。
结论:在大多数情况下,局部变量比全局变量更快。"

如果一个变量太大而无法保存在寄存器中怎么办?比如我创建了一个int[10000]数组并在循环中迭代它。如果数组在每次函数调用时都是本地创建的,那么它可能会比一次在全局空间分配相同的数组然后重复使用它要慢。 - mc.dev
在这种情况下,开发人员应该动态分配变量并传递指针。将其放在堆栈(局部变量)中并不是一个好主意,因为其大小受限制。将其设为全局变量也不是一个好主意,除非它真的是一个常数。 - Leon Carlo Valencia
你是对的 @LeonCarloValencia。然而,在某些指令(MISRA)下不应使用动态分配。在这种情况下,我会将数组在函数作用域内声明为静态而不是全局。 - ferdepe
2
这在某种程度上对编译器的优化做出了无根据的假设。如果编译器看到一个全局变量被重复访问,那么除非它被明确标记为 volatile,否则它很可能会将其优化为寄存器,而不是堆栈/本地变量。 - c z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接