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

 每天进步一点就好 发布于 2023-02-06 16:57

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

1 个回答
  • Foo和Bar 在这种情况下永远不会改变它们在不同的实例中可能会有所不同,但系统不会为每个对象的每个实例单独编译代码.这样做的开销会很糟糕.

    系统可能会检测到这种情况,但这种情况不大可能,您当然不能指望所有甚至大多数环境都这样做.foobar = foo*bar如果您认为乘法会对性能产生重大影响,那么您最好的选择就是存储自己并使用它.(这不太可能).

    2023-02-06 16:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有