我想知道Java虚拟机是否可以避免零乘法。
根据 Java 语言规范,“运算符的每个操作数(条件运算符 &&、|| 和 ?: 除外)似乎在执行操作本身的任何部分之前都经过了完全评估。”
因此,即使编译器或运行时可以检测到一个因素为零,如果另一个因素可能有副作用,它仍然必须评估另一个因素。
没有要求虚拟机这样做,一般来说我不会期望这样的事情;但虚拟机可以进行任何不影响线程可观察行为的优化,因此这是完全合法的。
我认为,如果编译器能够在编译时检测到其中一个操作数保证为零,那么它更有可能会优化乘法。在这种情况下,乘法将在到达虚拟机之前很久就被删除。
值得注意的是,乘以 0 并不总是 0。对于无穷大和 NaN,乘以 0 得到 NaN。
javac编译器会优化常量表达式。 如果编译器可以确定结果始终是固定值,它将在编译时执行计算。
HotSpot 编译器非常擅长优化不执行任何操作的代码。 这并不意味着它优化了您能想象到的所有可能的事情,只是它可以检测到的常见用例,乘以零可能是也可能不是其中之一。 它也可能因 JVM 实现而异。 简而言之,您不应该依赖它。