jvm帮我们和机器打交道

115 阅读2分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」

习以为常的区别

  • 上面我们通过字节码层面展示i++++i他们两个是没有区别的。那么我们平时认为的区别是什么情况呢

  • 对~ 。 我们得和赋值结合起来看才能看出中间的端倪

  • 上面是两段代码和两段代码对应的字节码。内部的却别就是与i++是先ILOAD再IINC .++i是先IINC在ILOAD。最终导致本地变量表的i在两段程序中结果不一样

问题分析

  • 我们直接就对i++++i 进行分析。对于两者区别我们不用赘述。今天我们从字节码层面来看看两者执行的区别
  • 对!我们就是要抛开外壳看本质东西

image-20210514132208664

  • 这段代码应该很简单明了了。我们通过编译查看下他的字节码吧。编译字节码方式很多你可以直接通过javac 。 我这里通过idea的插件来生成了。有细微的差别但是不会影响我们阅读的 。 为了阅读方便我截取了main主函数部分的字节码

  • 有了这五个指令的理解我们在阅读下i++的字节码吧。

  • ①、首先将值为3压入操作数栈中

  • ②、然后将操作数栈顶中元素写入到本地变量表第二个位置

  • ③、将本地变量表第二个位置内容加1操作

  • ④、结束

  • ⑤、为什么是加入到本地变量表第二个位置。因为本地变量表第一个默认是args 。就是主程序

  • 当我看了++i的字节码后发现跟i++执行一模一样 。 最终在本地变量表中的i都是2 。 所以说理解还是得看底层

总结

  • 有时候从别人那学到的总结经验仅仅是经验,并不一定能够说明内部深层次的东西。
  • i++先赋值后加1 。 ++i先加1后赋值 很多人肯定认为两个字节码执行不同。实际上呢。还是得看底层东西

点赞