千家信息网

jdk1.8中(a+b)*10的10是存在哪里的

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,今天就跟大家聊聊有关jdk1.8中(a+b)*10的10是存在哪里的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。今天看到一个很有意思的提问:
千家信息网最后更新 2024年12月12日jdk1.8中(a+b)*10的10是存在哪里的

今天就跟大家聊聊有关jdk1.8中(a+b)*10的10是存在哪里的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

今天看到一个很有意思的提问:(a+b)*10,10是存放在哪里的?是常量池么?如果是常量池,在进行运算的时候,是通过指针来找到的吧?

某回答:10是在常量池,常量池在jdk1.8以后已经移到元空间了。

要验证这个答案是否正确其实很简单,写一个测试方法通过javap查看编译后的字节码指令就能得出结论。

测试方法源码如下:

private int m(int a, int b) {     int r = a * b * 10;     return r; }

使用javap查看编译后的字节码如下:

private int m(int, int);   descriptor: (II)I   flags: ACC_PRIVATE   Code:     stack=2, locals=4, args_size=3          0: iload_1          1: iload_2          2: imul          3: bipush        10          5: imul          6: istore_3          7: iload_3          8: ireturn

笔者翻阅了一下JVM字节码指令表,相关指令如下图所示。

字节码指令由操作码和零个或多个操作数组成,编译后会被写入方法的Code属性中,操作数要么是立即数,要么是指向class文件结构常量池中常量的索引,要么是跳转目标指令的偏移量。

设立即数10为x,可得出以下结论:

当x取值在区间[-1,5]时,x直接被编译进方法的code属性中,作为iconst指令的操作数;

当x取值在区间[-128,127]时,x也直接被编译进方法的code属性中,作为bipush指令的操作数,取值范围[-128,127]是因为bipush指令的操作数只能是一个字节;

当x取值在区间[-32768,32767]时,x也直接被编译进方法的code属性中,作为sipush指令的操作数,取值范围[-32768,32767]是因为sipush指令的操作数有两个字节;

否则才会将x编译进class的常量池,在进行运算时通过ldc指令从常量池(元空间)push进操作数栈中。

看完上述内容,你们对jdk1.8中(a+b)*10的10是存在哪里的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

指令 常量 操作数 编译 字节 方法 属性 内容 区间 要么 空间 结论 范围 测试 运算 有意思 两个 多个 指向 指针 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全运营大会 上海 天融信 神舟通用数据库介绍 数据库字段的数据格式有哪些 网络安全篡改检测码 团市委开展网络安全进校园活动 税务局网络安全责任 临沂市安捷通网络技术 数据库两种访问方式 校园网络安全知识资料 vba提取两列不同数据库 暗黑破坏神2重制版玩什么服务器 嵌入式软件开发会衰落吗 上交网络安全专业课表 停车场用的服务器要什么配置电脑 xmind甘特图软件开发 网页输入存到数据库 软件开发服务行业税率 消防物联网大数据平台软件开发 网络技术与行政管理 网络安全的补丁 朝之夕网络技术服务中心 春节前公安信通网络安全检查 qq游戏打开出现服务器断开 江苏运营网络技术费用是多少 南昌鲲鹏系列服务器企业 诛仙2连接不上服务器 达梦数据库导入编码方式不一致 智能垃圾回收软件开发 沈阳安卓应用软件开发哪家公司好 2021网络安全开幕
0