如果我在编译时知道两个常量,Java 编译器会将它们折叠起来。
final static int foo = 2;
final static int bar = 17;
int myVariable;
int myFunction(){
return foo*bar + myVariable;
}
在运行时,myFunction 将返回 34 + myVariable,并且不需要像在编译时那样计算 2*17。
我的问题是:如果常量直到运行时才知道,它会做同样的事情吗?我相信这称为运行时代码特化。
final int foo;
final int bar;
int myVariable;
int myFunction(){
return foo*bar + myVariable;
}
如果 foo 和 bar 在对象的构造函数中被初始化为 2 和 17,那么 myFunction 是否会专门返回 34 + myVariable ,还是会在每次调用函数时仍然计算 foo*bar ,即使 foo*bar 永远不会改变?
*编辑:我指的是最新版本的 JVM,1.7.0_45。
最佳答案
Foo 和 Bar 在那种情况下永远不会改变,但在不同的情况下它们可能会有所不同,并且系统不会为每个对象的每个实例单独编译代码。这样做的开销将是可怕的。
系统可能会检测到这一点,但不太可能,而且您当然不能指望所有甚至大多数环境都这样做。您最好的选择是存储 foobar = foo*bar
如果您认为乘法会对性能产生重大影响,请自行使用它。 (这不太可能)。
关于java - JVM 是否进行运行时常量折叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20915991/