【问题标题】:C/C++ Compiler Optimization regarding Variable Scope关于变量范围的 C/C++ 编译器优化
【发布时间】:2014-10-13 05:42:30
【问题描述】:

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

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

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

【问题讨论】:

  • 在 C++ 中,局部变量在声明时被初始化。无论进行任何优化,通常都希望在最接近首次使用时声明它们,没有理由在不使用之前声明它们。
  • 试着引用你的资料。此外,C/C++ 不是一种语言。
  • @Jonathon C/C++ = C 和/或 C++。如果关于我的问题,两种语言之间有任何显着差异,那么任何答案都可以解释。
  • @CaptainOblivious 当然只有当他们确实有一个初始化器(或构造器)时

标签: c++ c optimization compiler-optimization


【解决方案1】:

在 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

【讨论】:

  • 来自 tbb 文档的内容:“...对循环内访问的标量值使用局部临时变量。这种技术可以提高性能,因为编译器可以清楚地看出这些值可以保存在寄存器中记忆”
【解决方案2】:

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

  • 编译器足够智能,可以跟踪数据依赖关系并判断何时需要变量;
  • 自动变量在进入函数时不会被初始化,但会在需要时被初始化;
  • 变量声明在源代码中的位置不会有影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2011-02-10
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多