首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Java字节码角度分析a++ ——提升硬实力2

  • 25-03-07 19:01
  • 3167
  • 14034
blog.csdn.net

首先建议先看一下基于前面的字节码知识:Java字节码的一段旅行经历——提升硬实力1

在日常的项目开发中,经常遇到a++、++a、a--之类,下面我们开始从字节码的视角来分析a++。

java代码如下:

  1. /*
  2. 从字节码角度分析 a++ 相关题目
  3. */
  4. public class T03_ByteAnalyseAPlusPlus {
  5. public static void main(String[] args) {
  6. int a = 10;
  7. int b = a++ + ++a + a--;
  8. System.out.println(a);
  9. System.out.println(b);
  10. }
  11. }

使用javap -v xxx.class 来查看类文件全部指令信息:javap -v T03_ByteAnalyseAPlusPlus,如下:

  1. public static void main(java.lang.String[]);
  2. descriptor: ([Ljava/lang/String;)V
  3. flags: ACC_PUBLIC, ACC_STATIC
  4. Code:
  5. stack=2, locals=3, args_size=1
  6. 0: bipush 10
  7. 2: istore_1
  8. 3: iload_1
  9. 4: iinc 1, 1
  10. 7: iinc 1, 1
  11. 10: iload_1
  12. 11: iadd
  13. 12: iload_1
  14. 13: iinc 1, -1
  15. 16: iadd
  16. 17: istore_2
  17. 18: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  18. 21: iload_1
  19. 22: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
  20. 25: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  21. 28: iload_2
  22. 29: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
  23. 32: return
  24. LineNumberTable:
  25. line 17: 0
  26. line 18: 3
  27. line 19: 18
  28. line 20: 25
  29. line 21: 32
  30. LocalVariableTable:
  31. Start Length Slot Name Signature
  32. 0 33 0 args [Ljava/lang/String;
  33. 3 30 1 a I
  34. 18 15 2 b I
  35. }
  36. SourceFile: "T03_ByteAnalyseAPlusPlus.java"
  37. Process finished with exit code 0

分析:

  • 注意:iinc指令是直接在局部变量槽位slot上进行运算
  • a++ 和 ++a 的区别是先执行 iload 还是先执行 iinc
    • a++是先加载iload,再自增iinc
    • ++a是先自增iinc,再加载iload

下面我们通过字节码来剖析如下两行代码在内存当中整个执行过程

  1. int a = 10;
  2. int b = a++ + ++a + a--;

下图是先将10通过bipush 放入操作数栈中

接着将10从操作数栈上弹出存入局部变量表1号槽位,相当于代码 int a = 10 执行完成

接着执行:int b = a++ + ++a + a--; 因为有从左往右的执行顺序,所以先执行a++,先将a的值加载到操作数栈中;通过iload_1加载1号槽位的数据到操作数栈中

接着执行a++自增1操作,这个操作是在局部变量表中完成的。相当于完成了a++执行

再接着执行++a自增1操作,这个操作也是在局部变量表中完成的

接着从局部变量表1号槽位加载数据到操作数栈中,即12入栈,完成发a++  、++a 各自的执行了

然后,iadd是将操作数栈中弹出(出栈)两个数12、10进行求和操作,得到22,最后将累加的结果22存入栈中。即完成了a++  + +aa的执行

接着,需要执行a--,先将局部变量表槽位1的数据12加载到操作数栈中

然后,将局部变量表槽位1的数据自减1

接着,执行iadd操作,将操作数栈12、22弹出栈后,进行求和操作得到34,再将34结果压入栈

最后,执行istore_2操作,将操作数栈弹出数据34,并压入局部变量表2号槽位中

 


文章最后,给大家推荐一些受欢迎的技术博客链接:

  1. Hadoop相关技术博客链接
  2. Spark 核心技术链接
  3. JAVA相关的深度技术博客链接
  4. 超全干货--Flink思维导图,花了3周左右编写、校对
  5. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
  6. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  7. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂

 


欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

                                           

       

 

 

 

注:本文转载自blog.csdn.net的不埋雷的探长的文章"https://blog.csdn.net/weixin_32265569/article/details/107970980"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top