小智 20
这完全取决于您的机器架构.通过单个已知地址访问全局变量,而通常通过索引地址寄存器来访问局部变量.两者之间差异很大的可能性非常小,但如果您认为这很重要,那么您应该为目标架构编写测试并测量差异.
这取决于但通常是,虽然这是一个微观问题.全局变量应该可以从许多上下文中引用,这意味着将它们放入寄存器是不可能的.在局部变量的情况下,这是可能的,也是可取的.实际上,范围越窄,编译器就越有机会优化访问/修改该变量.
在许多情况下,局部变量可能"更快",但我认为性能增益不会明显或超过拥有许多全局变量的额外维护成本.我在下面列出的所有内容都可以忽略不计,或者很容易因为程序中的任何其他低效率而相形见绌.我认为这些是微优化的完美例子.
局部变量位于堆栈中,更有可能位于缓存中.如果经常使用全局变量,那么这一点就没有意义,因为它也将在缓存中.
局部变量的作用域是函数 - 因此,编译器可以假定它们不会被任何其他函数调用更改.使用全局,编译器可能被迫重新加载全局值.
在某些64位计算机上,获取全局变量的地址分为两步 - 您还必须将全局的32位偏移量添加到64位基址.始终可以直接从堆栈指针访问局部变量.
有许多编译器优化可以使用局部变量,但不能使用全局变量,所以在某些情况下,您可能会看到性能上的差异.我怀疑你的全局变量是在一个性能关键的循环中被访问的(如果它是非常糟糕的设计!)所以它可能不会成为一个问题.