全局变量比C中的局部变量快吗? [关闭]

Posted

技术标签:

【中文标题】全局变量比C中的局部变量快吗? [关闭]【英文标题】:Are global variables faster than local variables in C? [closed] 【发布时间】:2017-04-30 01:19:29 【问题描述】:

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

【问题讨论】:

可以用“是”或“否”回答的问题是 SO 格式的问题。 这取决于很多因素,但通常关心这个是没有意义的。 完全取决于缓存行为。根据使用模式,两者都可能比另一个快 100 倍。 没有“堆栈”。只有具有自动存储持续时间的对象,如果它们的地址从未被占用,则可以将其保存在寄存器中。在几乎所有处理器架构上,访问寄存器比访问具有静态存储持续时间(如全局)的对象所需的内存访问要快得多。 在堆栈上“分配”一个值不需要额外的工作。堆栈指针只是移动了一个不同的数字。通过堆栈指针偏移一个值的访问时间与通过数据段寄存器偏移它的访问时间相同。所以你的想法大多是错误的。 【参考方案1】:

这是相当不准确的。

如果您研究计算机体系结构,您会发现最快的存储是寄存器,其次是高速缓存,然后是 RAM。关于局部变量的事情是编译器优化它们以尽可能从寄存器分配,或者如果没有则从缓存中分配。这就是局部变量更快的原因。

对于嵌入式系统,当然可以编译成微型内存模型,在这种情况下,您的数据段可能适合现代控制器的 SRAM 缓存。但在这种情况下,您的局部变量使用也会非常紧张,以至于它们可能完全在寄存器上运行。

结论:在大多数情况下,局部变量会比全局变量快。

【讨论】:

如果变量太大而无法保存在寄存器中怎么办?假设我创建 int[10000] 数组并在循环中对其进行迭代。如果在每次函数调用时都在本地创建数组,那么它可能会比在全局空间中分配一次相同的数组然后重用它要慢。 在这种情况下,开发人员应该动态分配变量并传递指针。由于其大小有限,将其放入堆栈(局部变量)不是一个好主意。使其全局化也不是一个好主意,除非它确实是一个常数。 你是对的@LeonCarloValencia。然而,在某些指令 (MISRA) 下不应使用动态分配。在这种情况下,我所做的是将函数范围内的数组声明为静态而不是全局。

以上是关于全局变量比C中的局部变量快吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的全局变量和局部变量

C语言中的 局部变量,存储在啥地方?

C语言基础:作用域规则(局部变量,全局变量,形式参数)全局变量与局部变量在内存中的区别初始化局部变量和全局变量

C语言中的局部变量和全局变量

C语言中的局部变量和全局变量

C语言中,局部变量和全局变量的问题