C 全局变量和静态变量的优化

C 全局变量和静态变量的优化,c,compiler-construction,storage,compiler-optimization,C,Compiler Construction,Storage,Compiler Optimization,我阅读了一些关于优化的主题,其中提到全局变量不能存储在寄存器中,因此,如果需要优化,我们使用寄存器变量存储全局数据并修改该寄存器变量。这也适用于静态变量吗 对于自动存储,如果我们将自动变量存储在寄存器变量中呢?从寄存器而不是堆栈进行访问会不会更快?全局变量和静态变量都存在于数据段中,其中包括数据、BSS和堆部分。如果静态变量初始化为0或未初始化为任何内容,则它将进入BSS部分。如果给它一个非零初始化值,则它位于“数据”部分。见: 至于自动变量和寄存器变量:寄存器并不保证变量将被存储在寄存器中,

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


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

全局变量和静态变量都存在于数据段中,其中包括数据、BSS和堆部分。如果静态变量初始化为0或未初始化为任何内容,则它将进入BSS部分。如果给它一个非零初始化值,则它位于“数据”部分。见:

至于自动变量和寄存器变量:寄存器并不保证变量将被存储在寄存器中,它更多的是提供来自程序员的提示。见:

是的,访问寄存器比访问堆栈内存快得多,但是现在这种优化取决于编译器(寄存器分配问题)以及CPU体系结构(这里有很多太复杂而无法解释的优化)


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

全局变量的值可以保存在寄存器中,只要编译器能够证明对存储值没有其他访问权限。对于无法保存在寄存器中的值,使用声明指针会声明在该指针的生命周期内不会通过任何其他方式访问该值;只是不要泄露任何副本,编译器会处理其余的。对于声明
thistype localval=globalval的标量至少也可以工作,甚至更好


只有在无法访问该值的情况下,才能使用
restrict
声明。例如,现在的优化器可以通过声明对象在一个函数中不会被访问来推断在另一个函数中访问它的代码路径不会被执行,并由此推断用于获取该代码路径的表达式的内容,依此类推。“”现在比以往任何时候都更加正确。

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