从字节码指令分析i=i++(i是long类型时)
来源:互联网 发布:烟台网亿网络好不好 编辑:程序博客网 时间:2024/05/16 10:07
刚写了个编文章说int i=i++的问题,之后想是iinc指令直接操作本地变量表草成的么,随之用long做了一下实验,看代码和编译后的指令,
public static void iAdd(long i) {i = i++;System.out.println(i);}
变异后的code的第1行的意思是复制栈顶一个(long、double型的)或两个(其它类型的)数值,并且复制值进栈,一直到第2行代码之后,这时候的栈是什么样子的呢?见下图
111第三行ladd指令,栈顶两个元素出栈,相加之后入栈
21紧接着连续两个lstore指令,将栈顶元素存储到相应的本地变量表,弹出2之后本地变量i=2,弹出1之后本地变量i=1;
后面的指令是输出语句的编译之后的指令,只做简单分析,6行获取常量池#3指示的静态域压入栈顶,9行加载本地变量表0出的变量到栈顶;
10行栈顶两个元素出栈,调用#4 字符产量指定的函数。最后一行return。
一些个人看法:
i=i++;之所以会出现 执行完不变的情况,是因为:先用再加,按说先用i=i,再加i++;也不会出现不变的情况,应该是,先用,并不是真正的先用,而是在栈中暂时存储,并没有真正给本地变量表的变量赋值,知道i++结束之后,才将之前放入战中的值弹出赋值。
这是i是long的情况下,去掉i=,之后编译后代码,发现少了一个dup2和lstore,也就是少了先用的入栈,和最后的出栈赋值。
另外安利一个比较不错的文章,里面对变异后的指令均做了介绍,帮助甚大。
JVM指令集(指令码、助记符、功能描述) --- 逐渐更新 --- 2011-08-23
(最后又想起来一点,为什么栈的大小是3,因为所有的出栈入栈操作,栈大小为3即可满足所有的入栈出栈操作,最大时为3)
0 0
- 从字节码指令分析i=i++(i是long类型时)
- 从字节码指令分析i=i++(i是int类型时)
- 字节码指令级别从i++说到volatile,深入理解i++的线程安全问题
- i++,++i,i=i+1 分析
- i=i++分析
- 从JAVA字节码看++i 和i++ 的区别
- java i++ ++i字节码解析
- java中i++ ++i字节码解释
- const long &i=10
- i++ + ++i问题 jvm指令
- i = i++为什么会是i原来的值??
- i = i++ 之后 i 的值为什么是 0
- 大话 i++、++i和i=++i、i=i++
- k=(++i)+(++i)+(++i)
- java中i=i++问题分析
- java中i=i++问题分析
- 汇编分析“int i = i”
- java中i=i++问题分析
- HTML5新增标签的使用
- 蛇形矩阵
- 线性回归与梯度下降
- Hadoop安装前准备
- 给ping timestamp
- 从字节码指令分析i=i++(i是long类型时)
- Android ButterKnife使用总结
- Windows内核驱动中操作文件
- NSRunLoop的使用
- poj 2451
- LA 11107 Life Forms
- 3D建模与处理软件简介
- Android dialog 通过背景bitmap的像素宽度进行定位显示
- 关于真机测试时INSTALL_FAILED_USER_RESTRICTED安装错误的问题