首页 > 其他分享 >从字节码角度深入剖析:i++和++i的逻辑

从字节码角度深入剖析:i++和++i的逻辑

时间:2023-11-07 11:55:05浏览次数:27  
标签:操作数 字节 ++ 位置 iinc 剖析 放到 slot1

i++和++i的深入剖析

先说结论:

  • i++或++i不参与运算的话,i++和++i的指令代码是没有区别的。
  • i++或++i参与运算。从字节码指令角度来看,主要是看先load还是先执行iinc 1 by 1的顺序。

不参与运算

先把0加载到操作数栈上,弹出放到slot1的局部变量表位置,iinc 1 by 1把索引为1的值拿到执行加1操作放到slot1位置。

 0 iconst_0
 1 istore_1
 2 iinc 1 by 1

参与运算

i++参与运算。从字节码指令角度来看,主要是看先load还是先执行iinc 1 by 1的顺序。

i++: 先把slot1位置的值加载到操作数栈,之后把对应slot1位置的元素自增,现在栈顶放的是原来的i值,所以再从操作数栈拿到栈顶值之后放到slot2位置;

++i:先执行slot1位置自增逻辑,之后把自增后的值load到操作数,此时操作数栈是自增后的值,再通过store放到局部变量表slot2位置,得到的是自增后的值。

    @Test
    public void testI2() {
        int a = 5;
        int c = a++;
        System.out.println(c);
//        0 iconst_5 // 把5放到操作数栈
//        1 istore_1 // 5出栈,放入局部变量表slot1位置;
//        2 iload_1 // 把slot1的5加载到操作数栈中;
//        3 iinc 1 by 1 // 把slot1位置的5执行加一操作得到6
//        6 istore_2 // 5出栈,放到局部变量表slot2位置;
//        7 return
    }
    @Test
    public void testI3() {
        int a = 5;
        int c = ++a;
        System.out.println(c);

//        0 iconst_5 // 把5放到操作数栈
//        1 istore_1 // 5出栈,放入局部变量表slot1位置;
//        2 iinc 1 by 1 // 把slot1位置的5执行加一操作得到6
//        5 iload_1 // 把slot1位置的6放到操作数栈;
//        6 istore_2 // 6出栈,存到slot2位置;
//        7 return

    }

标签:操作数,字节,++,位置,iinc,剖析,放到,slot1
From: https://www.cnblogs.com/benjieqiang/p/17814706.html

相关文章

  • C++禁用windows全局鼠标
    禁用全局鼠标的实现方式与禁用键盘类似,也是通过使用WindowsAPI函数来创建钩子来截取鼠标消息,然后在钩子函数中阻止特定鼠标事件的执行。下面是一个使用C++和WindowsAPI来禁用全局鼠标的示例代码:#include<iostream>#include<Windows.h>//定义全局的钩子句柄HHOOKmouseHook......
  • C++禁用windows全局键盘
    1.使用WindowsAPI函数调用来拦截键盘消息。2.创建一个键盘钩子来截取键盘消息。3.在钩子函数中,检测到特定按键事件时,阻止该事件执行。4.最终在程序退出时释放钩子。下面是一个使用C++和WindowsAPI来禁用Windows系统键盘的示例代码:#include<iostream>#include<Windows.h......
  • c/c++数据类型
    intunsignedintcharunsignedcharlonglonglongunsignedlongshortunsignedshortfloatdouble各种指针类型枚举类型struct结构类型union联合类型boolstring类 比如把数据类型比做盒子,定义类型就是存仓什么东西,假如int型把盒子分成4份......
  • C++模板显示指定类型时使用引用遇到的问题
    1.问题这里我想让模板函数接收int和char类型的参数,并进行相加,显示指定参数类型为int。第一个调用理论上会自动将char类型强转成int类型,后进行相加;第二个调用理论上会自动将int类型强转成char类型,后进行相加;但是报错Nomatchingfunctionforcallto'add_ab'template<typena......
  • C++ 入门防爆零教程(上册)
    ##C++入门防爆零教程(上册)###### C++IntroductoryExplosionProofZeroTutorial(Volume$1$)编写者:美公鸡(洛谷账号:beautiful_chicken233,电话:$155****7747$,如有需要请随时联系)编写时间:$2023.10.5\sim?$地址:湖南省长沙市雨花区明升异城$11$栋$3902$出版社:美公鸡......
  • 编译器Dev-C++的安装及使用
    编译器Dev-C++的安装及使用1.Dev-C++的安装下载链接:https://acm.nyist.edu.cn/file/2/Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.exe​下载​:点击此处下载安装点击安装包选择英文点击ok选择我同意无脑选下一步路径改不改都可占不了多少空间等待安装......
  • C++二维数组输出3
    题目描述输入一个整数\(N\),输出一个N行N列的二维矩阵,矩阵中的元素按列用\(1\)~\(N\)\(∗\)\(N\)蛇形填充。输入格式一个整数\red{N}\(N\)(\(N<=10\))输出格式输出N行N列的矩阵,元素之间用一个空格隔开,行末不要有多余的空格。样例输入数据3输出数据123654789......
  • C++交换a和b的值
    题目描述交换\(a\)和\(b\)的值输入格式一行,两个整数\(a\),\(b\)。输出格式一行,两个整数\(b\),\(a\),两个整数之间用空格隔开。样例输入样例51输出样例15数据范围与提示\(a\)和\(b\)保证在int范围内。\(Code\)#include<iostream>usingnamespacestd;i......
  • C++U4-03-递推1
    上节课作业部分(点击跳转)加法原理和乘法原理递推的概念 练习题1、[兔子数列]【算法分析】初始条件:第1个月有1对兔子,第2个月有1对兔子。当大于等于3个月时:第i个月兔子数=第i−1个月兔子数+第i−2个月兔子数。【参考代码】include<iostrea......
  • 二叉查找树的实现C/C++
    二叉查找树是一种关键字有序存放的二叉树。在不含重复关键字的二叉查找树中,关键字"较小"的节点一定在关键字“较大”的节点的左子树中,“较小”一般可以由内值类型的<运算符来实现,或由重载了<运算符的类类型的<运算符来实现。“较小”的概念可以根据我们的需要有不同的实现。本文实......