C/C++编译器关于变量作用域的优化

C/C++ Compiler Optimization regarding Variable Scope

本文关键字:变量 作用域 优化 C++ 编译器 于变量      更新时间:2023-10-16

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

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

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

在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的性能更好

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

  • 编译器足够聪明,可以跟踪数据依赖关系并判断何时需要变量
  • 自动变量不会在进入函数时初始化,而是在需要时稍后初始化
  • 变量声明放在源代码中的位置不会有任何影响