【问题标题】:Optimization for global and static variables全局和静态变量的优化
【发布时间】:2013-12-01 00:02:15
【问题描述】:

我阅读了一些关于优化的主题,其中提到全局变量不能存储在寄存器中,因此如果我们需要优化,我们使用寄存器变量来存储全局数据并修改该寄存器变量。这也适用于静态变量吗?

对于自动存储,如果我们将自动变量存储在寄存器变量中呢?从寄存器而不是堆栈访问不是更快吗?

【问题讨论】:

  • 在 C/C++ 中,'register' 关键字已被弃用。优化编译器在优化方面做得非常非常好,在这种优化中试图比编译器做得更好是不值得的。创建一个更优雅的算法是值得的,但不是在寄存器优化领域。

标签: c compiler-construction storage compiler-optimization


【解决方案1】:

数据段中同时存在全局变量和静态变量,包括数据段、BSS段和堆段。如果静态变量初始化为 0 或未初始化为任何值,则它进入 BSS 部分。如果它被赋予一个非零的初始化值,那么它就在“数据”部分。见:

http://en.wikipedia.org/wiki/Data_segment

至于 auto vs. register 变量: register 不保证变量会存储在寄存器中,它更多的是提供程序员的提示。见:

http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/storage_class.html

是的,访问寄存器比访问堆栈内存(快得多),但是现在这种优化留给编译器(寄存器分配问题)以及 CPU 架构(它有很大许多优化过于复杂,无法在此处解释)。

除非您正在为非常简单或旧的架构编程和/或使用非常过时的编译器,否则您可能不应该担心这种优化。

【讨论】:

    【解决方案2】:

    全局变量的值可以保存在寄存器中,只要编译器可以证明没有其他访问存储的值。对于本身不能保存在寄存器中的值,使用the restrict keyword 声明一个指针表示在该指针的生命周期内不会通过任何其他方式访问该值;只是不要放弃任何副本,编译器会处理其余的。对于声明thistype localval=globalval; 的标量,如果您没有更改值或者您对范围退出有很好的控制,至少也可以正常工作——甚至更好。

    您只能使用restrict 声明,如果该值真的不会被访问,否则。例如,如今的优化器可以从您声明不会在一个函数中访问对象中推断出在另一个函数中访问它的代码路径不会被执行,并由此推断出用于获取该代码的表达式的内容路径等。 “If you lie to the compiler, it will have its revenge”在今天比以往任何时候都更加真实。

    【讨论】:

      猜你喜欢
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 2015-06-12
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多