当我从一些小的
java函数中读取jvm字节码时,我发现当
一个新的局部变量在操作数堆栈上计算时,假设它将存储在局部变量表中,但通常它会立即加载到操作数堆栈中(仅字面上的字节码).我操作不好,是不必要的操作?
Java编译器倾向于以非常简单和直接的方式编译事物,从而将优化留给JIT.
例如,如果你写x * = 3; x * = 4;,你可能会得到字节码
iload_1
iconst_3
imul
istore_1
iload_1
iconst_4
imul
istore_1
理论上,编译器可以确定存储/加载对是冗余的并将其删除.但是有几个理由不这样做 – 1)这增加了很多复杂性而没有任何好处,因为JIT无论如何都会优化一切2)它使调试变得更难,因为你不再能够访问所有局部变量的值3)如果在此表达式的中间以某种方式抛出异常,则局部变量将具有不正确的值.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。