Java VM 是否跳过零乘法?

问题描述 投票:0回答:3

我想知道Java虚拟机是否可以避免零乘法。

java jvm virtual
3个回答
3
投票

根据 Java 语言规范,“运算符的每个操作数(条件运算符 &&、|| 和 ?: 除外)似乎在执行操作本身的任何部分之前都经过了完全评估。”

因此,即使编译器或运行时可以检测到一个因素为零,如果另一个因素可能有副作用,它仍然必须评估另一个因素。


2
投票

没有要求虚拟机这样做,一般来说我不会期望这样的事情;但虚拟机可以进行任何不影响线程可观察行为的优化,因此这是完全合法的。

我认为,如果编译器能够在编译时检测到其中一个操作数保证为零,那么它更有可能会优化乘法。在这种情况下,乘法将在到达虚拟机之前很久就被删除。


1
投票

值得注意的是,乘以 0 并不总是 0。对于无穷大和 NaN,乘以 0 得到 NaN。

javac编译器会优化常量表达式。 如果编译器可以确定结果始终是固定值,它将在编译时执行计算。

HotSpot 编译器非常擅长优化不执行任何操作的代码。 这并不意味着它优化了您能想象到的所有可能的事情,只是它可以检测到的常见用例,乘以零可能是也可能不是其中之一。 它也可能因 JVM 实现而异。 简而言之,您不应该依赖它。

© www.soinside.com 2019 - 2024. All rights reserved.