关于可变范围的C / C ++编译器优化

时间:2014-10-13 05:42:31

标签: c++ c optimization compiler-optimization

我不确定源代码,但我目前的知识是C / C ++函数的局部变量在函数入口处初始化。但我也可以读到,声明变量尽可能接近其使用将有助于编译器优化代码。我对这两个相互矛盾的论点感到困惑。

PS。 我问的是机器如何处理代码而不是人类。

编辑: 为了澄清我的问题,如果函数的所有局部变量都在函数的入口处初始化,那么在函数体中间声明变量除了更好的可读性之外没有其他好处。但是,我还读过声明接近其使用的变量有助于编译器进行优化。我很难理解这两个相互矛盾的论点是如何结合在一起的。任何解释都会有所帮助。

2 个答案:

答案 0 :(得分:3)

在C ++中,如果你声明最接近用法,那么如果没有命中该范围,那么变量根本不可能被构造。

class SomeHeavyObjectToConstruct { //...};

版本1:

SomeHeavyObjectToConstruct obj1;
if (some_condition) {
  // do something with obj1
} else {
  // won't touch obj1
}

第2版:

if (some_condition) {
  SomeHeavyObjectToConstruct obj1;
  // do something with obj1
} else {
  // won't touch obj1
}

通过这种方式,版本2的性能优于版本1

答案 1 :(得分:0)

我没有检查过真实案例,但我对编译器优化的理解告诉我:

  • 编译器足够智能,可以跟踪数据依赖关系并告知何时需要变量;
  • 自动变量在进入函数时不会被初始化,但稍后会在需要时初始化;
  • 在源代码中放置变量声明的地方不会产生任何影响。