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

时间:2013-12-01 00:02:16

标签: c compiler-construction storage compiler-optimization

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

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

2 个答案:

答案 0 :(得分:1)

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

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

对于auto与寄存器变量:寄存器不保证变量将存储在寄存器中,它更多地提供程序员的提示。参见:

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

是的,访问寄存器比访问堆栈内存要快得多,但现在这种优化由编译器(寄存器分配问题)以及CPU架构(具有很好的性能)决定许多优化过于复杂,无法在此解释。)

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

答案 1 :(得分:1)

只要编译器可以证明没有对存储值的其他访问,

全局变量的值就可以保存在寄存器中。对于无法在寄存器中保存的值,声明带有the restrict keyword的指针声明没有通过该指针生存期的任何其他方式访问值;只是不要放弃任何副本,编译器将负责其余的。对于标量thistype localval=globalval;的标量,如果你没有改变价值,或者你已经很好地控制范围退出,那么至少也可以起作用 - 甚至更好。

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