是否会在编译时优化局部变量的一次性使用?

Hee*_*jin 7 c++ java compiler-construction optimization

double calcTaxAmount() {
    double price = getA() * getB() + getC();
    double taxRate = getD() + getE();
    return price * taxRate;
}
Run Code Online (Sandbox Code Playgroud)

上述功能计算纳税金额.

通过调用其他一些功能来计算价格和费率.

我介绍了两个局部变量price和taxRate来提高代码的可读性,因此两者都只使用一次.在大多数现代编译器的编译时,这些"一次性"局部变量是否会被替换和内联?

小智 4

显然,这取决于编译器。相当多的编译器在优化方面实际上是脑死亡的,因为它们处理的动态语言足够复杂,以至于大多数优化都是无效的,而许多其他优化只有在满足非常严格的条件时才是安全的(例如,任何函数调用)几乎可以产生任何效果)。例如,所有 Python 实现都具有编译器,但大多数只进行很少的窥孔优化,这可能不足以消除所有开销。

也就是说,如果您谈论的是静态类型语言(您的示例暗示了这一点),那么通常是的。活性分析可以检测等价性(您仍然需要一个存储位置,但生命周期是相同的),并且任何合理的寄存器分配器都可以避免不必要的溢出值。

也就是说,这对于优化来说确实是一个糟糕的焦点。如果您确实想让事情变得更快,请查看最终的代码和具有实际场景的配置文件。如果您要进行微观优化,请应用一些常识。即使假设此函数是热点,实际计算和获取值也可能很容易花费 100 倍的时间。与堆栈存储相比,非内联函数调用需要相当长的时间,并且在这个级别上缓存未命中的成本也相当高。