我读了一些关于优化的主题,其中提到全局变量不能存储在寄存器中,因此如果我们需要优化,我们使用寄存器变量来存储全局数据并修改该寄存器变量。这也适用于静态变量吗?
对于自动存储,如果我们将自动变量存储在寄存器变量中会怎样?从寄存器而不是堆栈访问不是更快吗?
全局变量和静态变量都存在于数据段中,数据段包括数据段、BSS段和堆段。如果静态变量初始化为 0 或未初始化为任何值,则它会进入 BSS 部分。如果给它一个非零初始化值,那么它位于“数据”部分。参见:
http://en.wikipedia.org/wiki/Data_segment
对于自动变量与寄存器变量:寄存器并不保证变量一定会存储在寄存器中,更多的是给程序员提供一个提示。参见:
http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/storage_class.html
是的,访问寄存器比访问堆栈内存要快得多,但是现在这种优化取决于编译器(寄存器分配问题)以及CPU架构(有很多优化)太复杂了,无法在这里解释)。
除非您正在为非常简单或旧的架构进行编程和/或使用非常过时的编译器,否则您可能不应该担心这种优化。
只要编译器可以证明没有其他方法可以访问存储的值,全局变量的值就可以保存在寄存器中。 对于本身无法保存在寄存器中的值,使用
restrict
关键字声明指针,声明在该指针的生命周期内不会通过任何其他方式访问该值;只是不要泄露任何副本,编译器将处理其余的事情。 对于标量来说,如果您不更改值或者您可以很好地控制范围退出,则声明 thistype localval=globalval;
至少同样有效,甚至更好。
如果确实无法访问该值,则只能使用
restrict
声明。 例如,现在的优化器可以从您声明不会在一个函数中访问对象中推断出在另一个函数中访问该对象的代码路径不会被执行,并据此推断出用于获取该代码的表达式的内容路径等。 “如果你对编译器撒谎,它就会报复”在今天比以往任何时候都更加真实。