我很好奇。如果我创建一些仅用作其他变量的别名的局部变量(也就是说,一个新的“别名”变量只是被分配了其他变量的值,并且别名的分配永远不会改变),JVM是否会通过以下方式优化它:直接使用原始变量?
例如,我正在编写一个(不可变的)四元数类(quaternion 是一个具有四个值的 vector )。我编写了一个 multiply()
方法,该方法采用另一个 四元数
,将两者相乘,然后返回所得的四元数
。为了节省打字时间并提高可读性,我在执行实际计算之前创建了几个别名:
public class Quaternion {
private double[] qValues;
public Quaternion(double q0, double q1, double q2, double q3) {
qValues = new double[] {q0, q1, q2, q3};
}
// ...snip...
public Quaternion multiply(Quaternion other) {
double a1 = qValues[0],
b1 = qValues[1],
c1 = qValues[2],
d1 = qValues[3],
a2 = other.qValues[0],
b2 = other.qValues[1],
c2 = other.qValues[2],
d2 = other.qValues[3];
return new Quaternion(
a1*a2 - b1*b2 - c1*c2 - d1*d2,
a1*b2 + b1*a2 + c1*d2 - d1*c2,
a1*c2 - b1*d2 + c1*a2 + d1*b2,
a1*d2 + b1*c2 - c1*b2 + d1*a2
);
}
}
因此,在这种情况下,JVM 是否会取消 a1
、b1
等,而只使用 qValues[n]
和直接other.qValues[n]
?
最佳答案
不存在您在 Java 中描述的别名之类的东西。当您将一个内存位置中的值分配给新变量时,JVM 会复制该值。如果要创建别名,则在计算过程中从另一个线程更改底层数组将会改变结果。这在您的示例中不会发生,因为您明确告诉 JVM 首先复制值。
如果您担心性能,请不要担心。程序的正确性胜过所有性能问题。任何更快地产生错误结果的程序都是毫无值(value)的。我并不是说直接在计算内部访问数组必然会产生不正确的结果,因为我还没有看到其余的代码,但我是说,如果不先找到一个合适的方法,这种类型的微优化不值得您付出努力。性能问题,然后执行时序测试来验证问题所在。
关于java - JVM 是否优化别名变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9628909/