java - JVM 是否进行运行时常量折叠?

标签 java jvm constantfolding

如果我在编译时知道两个常量,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/

相关文章:

基于套接字的 Java Derby

java - 如何调查 JVM 崩溃的原因?

c - 为什么在 C for 循环的条件语句中使用表达式而不是常量?

c++ - 避免打开类型以允许不断折叠

perl - 这两个 eval 之间的区别是否用常量折叠来解释?

java - 正则表达式验证仅适用于一个字符

java - CAS 4.2.x 部署器ConfigContext.xml 连接到 LDAP

java - 动画元素从消失到可见(而不是从不可见)

jvm - JNI,如何在JNI中访问当前Java线程

jvm - HotSwapAgent 插件 - 找不到插件类