C++全局变量的性能

Dr.*_*ula 11 c++

澄清:我知道邪恶的全局是什么以及何时不使用它们:)

  • 在编译的C++程序中访问/设置全局变量与本地变量时是否存在性能损失?

小智 20

这完全取决于您的机器架构.通过单个已知地址访问全局变量,而通常通过索引地址寄存器来访问局部变量.两者之间差异很大的可能性非常小,但如果您认为这很重要,那么您应该为目标架构编写测试并测量差异.

  • @Dr.Acula Computers是真实世界的机器,不是理想化的概念.如果您需要尽可能快地运行代码,则必须解决现实世界机器的各种怪癖问题.当然,99.99%的时间你不需要你的代码尽可能快地运行,只有足够快 - 在这种情况下你甚至不应该考虑优化,而是留给编译器. (4认同)

Ara*_*raK 8

这取决于但通常是,虽然这是一个微观问题.全局变量应该可以从许多上下文中引用,这意味着将它们放入寄存器是不可能的.在局部变量的情况下,这是可能的,也是可取的.实际上,范围越窄,编译器就越有机会优化访问/修改该变量.

  • 实际上,您可以在 gcc 的寄存器中放置一个全局变量: register unsigned long *ds asm("ebx"); 但这可能会更慢,因为您正在耗尽寄存器的整个代码库。 (2认同)

Mic*_*ael 6

在许多情况下,局部变量可能"更快",但我认为性能增益不会明显或超过拥有许多全局变量的额外维护成本.我在下面列出的所有内容都可以忽略不计,或者很容易因为程序中的任何其他低效率而相形见绌.我认为这些是微优化的完美例子.

局部变量位于堆栈中,更有可能位于缓存中.如果经常使用全局变量,那么这一点就没有意义,因为它也将在缓存中.

局部变量的作用域是函数 - 因此,编译器可以假定它们不会被任何其他函数调用更改.使用全局,编译器可能被迫重新加载全局值.

在某些64位计算机上,获取全局变量的地址分为两步 - 您还必须将全局的32位偏移量添加到64位基址.始终可以直接从堆栈指针访问局部变量.


Ada*_*erg 5

严格来说,没有.

需要考虑的一些事项:全局变量会增加内存中程序的静态大小.如果需要同步对变量的访问,则会产生一些性能开销.


Pau*_*l R 5

有许多编译器优化可以使用局部变量,但不能使用全局变量,所以在某些情况下,您可能会看到性能上的差异.我怀疑你的全局变量是在一个性能关键的循环中被访问的(如果它是非常糟糕的设计!)所以它可能不会成为一个问题.